Из моей 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", потому что я привязываю ItemSource DataGrid.
В ViewModel я могу получить доступ к элементу 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. Проблема в том, что метод IndexOf ItemCollection не работает. Я получаю только -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();}
РЕДАКТИРОВАТЬ ---------------------------------- Это более простой подход, но мне все еще нужна помощь с выражением лямбда/фильтр и вызов метода
// 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. Мне нужно привести объект класса, т.е. myobject во что-то распознаваемое ItemCollection, которое я получил из DataGrid. Есть ли обходной путь? Спасибо.
foreach(var item in ItemsLcv) { //if some condition is met var idx = _dgItems.IndexOf(item); }
22.08.2016AdrTypeMdl
23.08.2016