从我的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}"
在datacontext ViewModel中:
private IEnumerable<AdrTypeMdl> _itemsList;
ItemsLcv = CollectionViewSource.GetDefaultView(_itemsList) as ListCollectionView;
即使我在ViewModel中没有为数据字段设置属性&#34; descr&#34;,这也是有效的,因为我绑定了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);
编辑-------这是方法的整个代码尝试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中看到类对象。如果我这样做,它就可以了。
var idx = _dgItems.IndexOf(_dgItems[2]);
但是当参数只是一个类Object时,IndexOf方法不起作用。我认为问题在于我将DataGrid项目转换为ItemCollection。我需要转换类Object,即。 myobject,是我从DataGrid获得的ItemCollection可识别的东西。有解决方法吗?谢谢。
答案 0 :(得分:0)
试试这个。
您需要将其强制转换为集合类型AdrTypeMdl
。您不能通过传递对象来简单地获取索引。您已绑定到ItemsLcv
类型的来源AdrTypeMd1
。所以传递那个确切的类型来获得确切的索引。
var dgcolumn = myobject as AdrTypeMdl;
if(dgcolumn != null)
{
var idx = _dgItems.IndexOf(dgcolumn);
}
idx
将是相应列的索引。