Если я использую DataTrigger для установки содержимого ContentControl в DataTemplate элемента в списке, только последний элемент работает правильно.Почему только последний элемент получает флажок или переключатель?
Вот XAML, в котором свойство модели представления окна AllowMultiItem определяет, нужны ли мне флажки или переключатели:
Код: Выделить всё
[*]
Почему это происходит?? Как я могу решить эту проблему?
Другой код — может быть неактуален
Не уверен, что это полезно, но если вы хотите проверить модель представления окна и модель представления элементов или если вы хотите полностью воспроизвести мой тест, коды приведены ниже. Я сделал этот тест максимально простым, чтобы никакие посторонние ошибки не повлияли на результат.
Модель просмотра окна (со статической функцией открытия окна):
Код: Выделить всё
// 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"));
}
}
Несколько вещей, которые я попробовал
- Пытался добавить INotifyPropertyChanged в MyViewModel и активировать изменение в AllowMultiItem после OnContentRendered - ничего не изменилось
- Пытался изменить привязки DataTrigger на RelativeSource, ориентированные на окно: любопытно, что теперь первый элемент попадает в коробку, но только первый
Подробнее здесь: https://stackoverflow.com/questions/784 ... -a-listbox
Мобильная версия