Почему DataTrigger работает только для последнего элемента в списке?C#

Место общения программистов C#
Ответить
Anonymous
 Почему DataTrigger работает только для последнего элемента в списке?

Сообщение Anonymous »

Я пытаюсь найти ответ на этот вопрос (элементы списка показывают либо флажок, либо переключатель в зависимости от свойства модели представления), и столкнулся с очень странным поведением.
Если я использую DataTrigger для установки содержимого ContentControl в DataTemplate элемента в списке, только последний элемент работает правильно.Почему только последний элемент получает флажок или переключатель?
Вот XAML, в котором свойство модели представления окна AllowMultiItem определяет, нужны ли мне флажки или переключатели: Когда я это делаю, независимо от того, когда AllowMultiItem имеет значение true или false, только последний элемент в списке получает флажок или переключатель.
Почему это происходит?? Как я могу решить эту проблему?
Другой код — может быть неактуален
Не уверен, что это полезно, но если вы хотите проверить модель представления окна и модель представления элементов или если вы хотите полностью воспроизвести мой тест, коды приведены ниже. Я сделал этот тест максимально простым, чтобы никакие посторонние ошибки не повлияли на результат.
Модель просмотра окна (со статической функцией открытия окна):

Код: Выделить всё

// didn't feel the need for INotifyPropertyChanged
// since nothing here is supposed to change
public class MyViewModel
{
public List Items { get; private set; }
public bool AllowMultiItem { get; private set; }

public MyViewModel(List items, bool allowMultiItem)
{
Items = items;
AllowMultiItem = allowMultiItem;
}

public static void ShowWindow(bool allowMultiItem)
{
// just creating items with names from 1 to 10
List items = Enumerable.Range(1, 10)
.Select(index=> new MyListItem("Item " + index.ToString()))
.ToList();

// create view model
MyViewModel vm = new MyViewModel(items, allowMultiItem);

// create and show window
MyWindow window = new MyWindow();
window.DataContext = vm;
window.ShowDialog();
}
}
Модель представления элемента:

Код: Выделить всё

public class MyListItem : INotifyPropertyChanged
{
private bool _checked;
private string _text;

public event PropertyChangedEventHandler PropertyChanged;

public string Text { get { return _text; } set { SetText(value); } }
public bool IsChecked { get { return _checked; } set { SetChecked(value); } }

public MyListItem(string text)
{
SetText(text);
SetChecked(false);
}

private void SetChecked(bool value)
{
if (value == _checked) return;

_checked = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("IsChecked"));
}

private void SetText(string value)
{
if (value == _text)
return;

_text = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Text"));
}
}
Тестовые примеры просто вызывают MyViewModel.ShowWindow(true) и MyViewModel.ShowWindow(false)
Несколько вещей, которые я попробовал
  • Пытался добавить INotifyPropertyChanged в MyViewModel и активировать изменение в AllowMultiItem после OnContentRendered - ничего не изменилось
  • Пытался изменить привязки DataTrigger на RelativeSource, ориентированные на окно: любопытно, что теперь первый элемент попадает в коробку, но только первый


Подробнее здесь: https://stackoverflow.com/questions/784 ... -a-listbox
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»