在我的 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;
即使我在 ViewModel 中没有数据字段“descr”的属性,这仍然有效,因为我绑定了 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 方法不起作用。当我尝试通过这样做来查找其中一个类对象项的索引时,我只得到-1。
var idx = _dgItems.IndexOf(myobject);
编辑 ------- 这是方法 try 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 / filter 表达式的帮助和方法调用
// 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 中的类 Objects。如果我这样做,它会起作用。
var idx = _dgItems.IndexOf(_dgItems[2]);
但是当参数只是一个类Object时IndexOf方法不起作用。我认为问题在于我将 DataGrid 项目转换为 ItemCollection。我需要转换类对象,即。myobject,我从 DataGrid 获得的 ItemCollection 可识别的东西。有解决方法吗?谢谢你。