Как получить объект IndexOf в .Net ItemCollection

wpf datagrid indexof listcollectionview itemcollection

191 просмотра

1 ответ

Из моей ViewModel мне нужно программно переместить фокус и выделение строки в DataFrid WPF. 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", потому что я связываю ItemSrid ItemSource.

В ViewModel я могу получить доступ к ItemCrid коллекции ItemGrid элементов, передав эту коллекцию 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);

РЕДАКТИРОВАТЬ ------- это весь код метода попробуйте 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();}

КОНЕЦ РЕДАКТИРОВАНИЯ ---------------------

В отладчике я вижу класс Objects в _dgItems. Если я делаю это, это работает.

        var idx = _dgItems.IndexOf(_dgItems[2]);

Но метод IndexOf не работает, когда параметр является просто объектом класса. Я думаю, что проблема в том, что я привел элементы DataGrid к ItemCollection. Мне нужно привести класс Object, т.е. myobject, к чему-то узнаваемому с помощью ItemCollection, полученной из DataGrid. Есть ли обходной путь? Спасибо.

Автор: harpagornis Источник Размещён: 08.11.2019 10:58

Ответы (1)


0 плюса

Решение

Попробуй это.

Вы должны привести его к типу коллекции , т.е. AdrTypeMdl. Вы не можете просто получить индекс, передав объект. Вы привязываетесь к источнику, ItemsLcvкоторый имеет тип AdrTypeMd1. Так что передайте этот точный тип, чтобы получить точный индекс.

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

idx будет индекс этого соответствующего столбца.

Автор: ViVi Размещён: 20.08.2016 08:14
Вопросы из категории :
32x32