0

ViewModel から、WPF DataGrid 内の行のフォーカスとハイライトをプログラムで移動する必要があります。DataGrid には 1 つの列しかありません。

   <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;

これは、DataGrid の ItemSource をバインドしているため、データ フィールド「descr」の ViewModel にプロパティ自体がなくても機能します。

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 の DataGrid プロパティを保持できるように、ItemCollection へのキャストを保持したいと考えています。問題は、ItemCollection の IndexOf メソッドが機能していないことです。これを行ってクラス オブジェクト項目の 1 つのインデックスを見つけようとすると、-1 しか取得できません。

  var idx = _dgItems.IndexOf(myobject);

EDIT ------- これはメソッド 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();}

編集 --------------------------------- これは簡単なアプローチですが、ラムダ/フィルター式についてはまだ助けが必要ですとメソッド呼び出し

// 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]);

ただし、パラメーターが単なるクラス オブジェクトの場合、IndexOf メソッドは機能しません。問題は、DataGrid アイテムの ItemCollection へのキャストにあると思います。クラス Object をキャストする必要があります。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 に答える