如何在 .Net ItemCollection 中获取 IndexOf 对象
How to get IndexOf Object in .Net ItemCollection
在我的 ViewModel 中,我需要以编程方式移动 WPF DataGrid 中一行的焦点和突出显示。 DataGrid 只有一列:
<DataGrid Name="DgAdrType"
ItemsSource="{Binding ItemsLcv}"
IsSynchronizedWithCurrentItem="True"
<DataGridTextColumn Header=" Description"
IsReadOnly="True"
CanUserSort="True" Binding="{Binding descr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
并且在数据上下文 ViewModel 中:
private IEnumerable<AdrTypeMdl> _itemsList;
ItemsLcv = CollectionViewSource.GetDefaultView(_itemsList) as ListCollectionView;
即使我在数据字段 "descr" 的 ViewModel 中没有 属性 本身,这仍然有效,因为我绑定了 DataGrid 的 ItemSource。
在 ViewModel 中,我可以通过从 View 中传入 ItemCollection 来访问 View DataGrid 的项目 ItemCollection,如下所示:
<!-- Interaction for click selection -->
<i:Interaction.Triggers>
<i:EventTrigger EventName="GotMouseCapture">
<i:InvokeCommandAction Command="{Binding SelObjChangedCommand}"
CommandParameter="{Binding ElementName=DgAdrType, Path=Items}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
然后回到 ViewModel,我像这样加载 DataGrid 项目:
private ItemCollection _dgItems;
private void SelObjChanged(object theItems)
{if (theItems !=null)
{ _dgItems = theItems as ItemCollection;
我想保留对 ItemCollection 的转换,以便我可以保留该 ItemCollection 的 DataGrid 属性。问题是 ItemCollection 的 IndexOf 方法不起作用。当我尝试通过这样做找到 class 对象项之一的索引时,我只会得到 -1 。
var idx = _dgItems.IndexOf(myobject);
编辑 ------ 这是尝试 IndesOf
方法的完整代码
private void HandleUpdateListEvent(Object myobject)
{AdrTypeMdl theNewItem = myobject as AdrTypeMdl;
bool co = _dgItems.Contains(theNewItem);
var idx = _dgItems.IndexOf(theNewItem);
_dgItems.MoveCurrentToPosition(idx);
_dgItems.Refresh();}
编辑--------------------------------
这是更简单的方法,但我仍然需要有关 lambda/过滤器表达式和方法调用的帮助
// this is where I try to get the index of an object for highlighting
private void HandleUpdateListEvent(Object myobject)
AdrTypeMdl theNewItem = myobject as AdrTypeMdl;
var e = ItemsLcv.SourceCollection.GetEnumerator();
ItemsLcv.Filter = o => (o == theNewItem);
foreach (row in ItemsLcv)
{ if row == theNewItem
return e >;
e = -1;}
ItemsLcv.MoveCurrentToPosition(e);
ItemsLcv.Refresh();}
结束编辑--------------------
在调试器中,我可以在 _dgItems 中看到 class 个对象。如果我这样做,它会起作用。
var idx = _dgItems.IndexOf(_dgItems[2]);
但是当参数只是一个 class 对象时,IndexOf 方法不起作用。我认为问题在于我将 DataGrid 项目转换为 ItemCollection。我需要投射 class 对象,即。 myobject,到我从 DataGrid 获得的 ItemCollection 可识别的东西。有解决方法吗?谢谢。
试试这个。
您需要将其转换为集合类型,即 AdrTypeMdl
。您不能简单地通过传递对象来获取索引。您正在绑定到 AdrTypeMd1
类型的来源 ItemsLcv
。因此,传递确切的类型以获得确切的索引。
var dgcolumn = myobject as AdrTypeMdl;
if(dgcolumn != null)
{
var idx = _dgItems.IndexOf(dgcolumn);
}
idx
将是相应列的索引。
在我的 ViewModel 中,我需要以编程方式移动 WPF DataGrid 中一行的焦点和突出显示。 DataGrid 只有一列:
<DataGrid Name="DgAdrType"
ItemsSource="{Binding ItemsLcv}"
IsSynchronizedWithCurrentItem="True"
<DataGridTextColumn Header=" Description"
IsReadOnly="True"
CanUserSort="True" Binding="{Binding descr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
并且在数据上下文 ViewModel 中:
private IEnumerable<AdrTypeMdl> _itemsList;
ItemsLcv = CollectionViewSource.GetDefaultView(_itemsList) as ListCollectionView;
即使我在数据字段 "descr" 的 ViewModel 中没有 属性 本身,这仍然有效,因为我绑定了 DataGrid 的 ItemSource。
在 ViewModel 中,我可以通过从 View 中传入 ItemCollection 来访问 View DataGrid 的项目 ItemCollection,如下所示:
<!-- Interaction for click selection -->
<i:Interaction.Triggers>
<i:EventTrigger EventName="GotMouseCapture">
<i:InvokeCommandAction Command="{Binding SelObjChangedCommand}"
CommandParameter="{Binding ElementName=DgAdrType, Path=Items}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
然后回到 ViewModel,我像这样加载 DataGrid 项目:
private ItemCollection _dgItems;
private void SelObjChanged(object theItems)
{if (theItems !=null)
{ _dgItems = theItems as ItemCollection;
我想保留对 ItemCollection 的转换,以便我可以保留该 ItemCollection 的 DataGrid 属性。问题是 ItemCollection 的 IndexOf 方法不起作用。当我尝试通过这样做找到 class 对象项之一的索引时,我只会得到 -1 。
var idx = _dgItems.IndexOf(myobject);
编辑 ------ 这是尝试 IndesOf
方法的完整代码private void HandleUpdateListEvent(Object myobject)
{AdrTypeMdl theNewItem = myobject as AdrTypeMdl;
bool co = _dgItems.Contains(theNewItem);
var idx = _dgItems.IndexOf(theNewItem);
_dgItems.MoveCurrentToPosition(idx);
_dgItems.Refresh();}
编辑-------------------------------- 这是更简单的方法,但我仍然需要有关 lambda/过滤器表达式和方法调用的帮助
// this is where I try to get the index of an object for highlighting
private void HandleUpdateListEvent(Object myobject)
AdrTypeMdl theNewItem = myobject as AdrTypeMdl;
var e = ItemsLcv.SourceCollection.GetEnumerator();
ItemsLcv.Filter = o => (o == theNewItem);
foreach (row in ItemsLcv)
{ if row == theNewItem
return e >;
e = -1;}
ItemsLcv.MoveCurrentToPosition(e);
ItemsLcv.Refresh();}
结束编辑--------------------
在调试器中,我可以在 _dgItems 中看到 class 个对象。如果我这样做,它会起作用。
var idx = _dgItems.IndexOf(_dgItems[2]);
但是当参数只是一个 class 对象时,IndexOf 方法不起作用。我认为问题在于我将 DataGrid 项目转换为 ItemCollection。我需要投射 class 对象,即。 myobject,到我从 DataGrid 获得的 ItemCollection 可识别的东西。有解决方法吗?谢谢。
试试这个。
您需要将其转换为集合类型,即 AdrTypeMdl
。您不能简单地通过传递对象来获取索引。您正在绑定到 AdrTypeMd1
类型的来源 ItemsLcv
。因此,传递确切的类型以获得确切的索引。
var dgcolumn = myobject as AdrTypeMdl;
if(dgcolumn != null)
{
var idx = _dgItems.IndexOf(dgcolumn);
}
idx
将是相应列的索引。