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 で認識できるものに変更します。回避策はありますか? ありがとうございました。