Nano Hash - криптовалюты, майнинг, программирование

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

Из моей 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. Есть ли обходной путь? Спасибо.


Ответы:


1

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

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

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

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

20.08.2016
  • Да, я пробовал это и даже явное объявление ниже, но все равно получаю -1 для idx. AdrTypeMdl theNewItem = полезная нагрузка как AdrTypeMdl. 20.08.2016
  • Я имею в виду весь код, чтобы попытаться воспроизвести проблему. 20.08.2016
  • Это приложение Prism Unity, и потребуется много времени, чтобы масштабировать его только до этих рабочих частей. 21.08.2016
  • Я думаю, что подход заключается в том, чтобы добавить метод фильтра в ItemsLcv. Поскольку это CollectionView, двунаправленно связанный с ItemCollection DataGrid, я могу просто получить искомый индекс, перебирая CollectionView с помощью перечислителя. Затем я могу обновить Currentitem в CollectionView, и DataGrid также автоматически обновится. Мне нужна помощь с реализацией метода лямбда/фильтра и вызова метода. Как мне изменить новый код, который я добавил к вопросу? 22.08.2016
  • Мне жаль. Но я не могу понять ваш код, опубликованный выше. попробуй foreach(var item in ItemsLcv) { //if some condition is met var idx = _dgItems.IndexOf(item); } 22.08.2016
  • Спасибо. Я думаю, что мне может понадобиться также ввести объект для сравнения. 23.08.2016
  • Да, конечно. Приведите его к нужному типу. В вашем случае AdrTypeMdl 23.08.2016
  • Спасибо за помощь. Я отмечу это ответом. Я предполагаю, что DataGrid не строго типизирует или не использует свою ItemCollection, что объясняет, почему IndexOf не работал. 23.08.2016
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..