0

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

4

1 回答 1

0

试试这个。

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

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

idx将是相应列的索引。

于 2016-08-20T08:14:05.520 回答