如何在.Net ItemCollection

时间:2016-08-20 06:48:08

标签: wpf datagrid indexof listcollectionview 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}"

在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可识别的东西。有解决方法吗?谢谢。

1 个答案:

答案 0 :(得分:0)

试试这个。

您需要将其强制转换为集合类型AdrTypeMdl。您不能通过传递对象来简单地获取索引。您已绑定到ItemsLcv类型的来源AdrTypeMd1。所以传递那个确切的类型来获得确切的索引。

var dgcolumn = myobject as AdrTypeMdl;
if(dgcolumn != null)
{
    var idx = _dgItems.IndexOf(dgcolumn);
}

idx将是相应列的索引。