powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ListView с checkbox и событие
21 сообщений из 21, страница 1 из 1
ListView с checkbox и событие
    #39258974
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть у меня такой класс:
Код: c#
1.
2.
3.
4.
5.
6.
public class MyInfo
{
  public int ID { get; set; }
  public string Remark { get; set; }
  public IsChecked { get; set; }
}


Потом я создаю ObservableCollection<MyInfo> Data { get; set; } и делаю биндинг к ListView (у которого есть колонка с чекбоксами). Как теперь для кнопки менять IsEnabled в зависимости от того, есть галка в колонке с чекбоксами или нет. В рамках MVVM.
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259019
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кнопка-то где? В темплейте строки или вообще вне ListView?
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259032
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, кнопка вне ListView...
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259048
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну можно привязать её IsEnabled к Linq-выражению с Any, а при изменении чекбокса генерировать событие PropertyChanged для этого свойства.

События CheckedEvent и UnheckedEvent - всплывающие - можно ловить их централизованно на уровне листбокса.
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259060
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда такой вопрос, немного отвлеченный от темы: как для всей коллекции (списка) элементов подписаться на изменения свойства? Пусть одного IsChecked в данном случае. То что, класс MyInfo будет реализовывать интерфейс INotifyPropertyChanged это понятно...
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259086
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если хочется подписываться на события самой модели - кто мешает? Можно через CollectionChanged (и смотреть добавленные элементы), либо просто сделать собственное централизованное добавление в коллекцию.
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259096
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я имею ввиду изменение значения одного из свойств коллекции/списка...
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259099
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И я вроде о том же. В чем конкретно вопрос?
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259137
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем тут ListView? когда достаточно ItemsControl?
Еще я для себя сделал UniversalBox, где в качестве контейнера может выступать любой из существующих ContentControl'ов, что довольно удобно.
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259152
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Roman Mejtesзачем тут ListView? когда достаточно ItemsControl?почему ты так думаешь? Может ему нужно ширину столбцов менять или, скажем, прямоугольное выделение делать.... В контексте вопроса, в общем-то, без разницы
Roman MejtesUniversalBox, где в качестве контейнера может выступать любой из существующих ContentControl'овА в чем удобство большее, чем шаблон Item-а?
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259204
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProRoman MejtesUniversalBox, где в качестве контейнера может выступать любой из существующих ContentControl'овА в чем удобство большее, чем шаблон Item-а?
Визуальное дерево получается короче
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259604
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ListView здесь нужен в явном виде не нужен, но для привычного внешнего вида оставлен. А по теме, сделал так: во ViewModel'е в конструкторе я в цикле foreach подписываюсь на событие изменения свойства объекта, в обработчике меняю свойство ViewModel'и IsCheckedLV, которое управляет поведением кнопки. Так же я во ViewModel'и же обрабатываю событие CollectionChanged, в обработчике которого вызываю все тот же метод, определяющий количество чекнутых галок и меняющий свойство IsCheckedLV. Работает. Хотел для идеальности передавать в метод новые элементы, чтобы только для них подписываться на изменения
Код: c#
1.
(ObservableCollection<MyInfo>)e.NewItems


но тут возникла ошибка приведения типов...
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259618
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
неудивительно, оно ведь не является тем, к чему вы хотите привести.

а зачем вам приведение к какому-то типу, если NewItems реализует IEnumerable?
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259639
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Например, чтобы передать эти элементы в метод, который будет
Код: c#
1.
Data.ForEach(x => x.ProperyChanged += MyPropertyChanged)


То есть - в начале метод бы принимал всю коллекцию, а потом - только добавленные элементы. Ну так планировалось)
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259669
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Qwe.Qwe1метод, который будет Data.ForEachтак чем не устраивает обычный foreach?
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259678
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: c#
1.
2.
3.
4.
5.
6.
private void SetHandler(ObservableCollection<MyInfo> data)
{
  data.ForEach(x => x.ProperyChanged += MyPropertyChanged);
}

SetHandler((ObservableCollection<MyInfo>)e.NewItems); // error
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259690
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё грустно....

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
private void SetHandler(IEnumerable<MyInfo> data)
{
  foreach (var item in data)
  {
    data.ProperyChanged += MyPropertyChanged
  }
}

SetHandler(e.NewItems.Cast<MyInfo>())
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259714
Qwe.Qwe1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
private bool _isCheckedLV;
public bool IsCheckedLV
{
  get { return _isCheckedLV; }
  set { _isCheckedLV= value; OnPropertyChanged(); }
}

public MyViewModel()
{
  <...>
  SetHandlerToEventIsCheckedChanged(Data);
  Data.CollectionChanged += Data_CollectionChanged;
}

private void SetHandlerToEventIsCheckedChanged(IEnumerable<MyInfo> data)
{
  data.ForEach(x => x.PropertyChanged += InfoPropertyChanged);
}

private void Data_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
  SetHandlerToEventIsCheckedChanged(e.NewItems.Cast<MyInfo>());
  SetChecked();
}

private void InfoPropertyChanged(object sender, PropertyChangedEventArgs e)
{
  if (e.PropertyName == "IsChecked")
  {
    SetChecked(); 
  } 
}

private void SetChecked()
{
  IsCheckedLV = Data.Any(x => x.IsChecked);
}
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259874
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще использовать foreach для e.NewItems у ObsevableCollection бессмысленно, по причине того, что в ней вообще нет методов "групповой" вставки и удаления. А классы унаследованные от ICollectionView, который оборачивают коллекцию при любом связывании с UI строго проверяют эти значения на то, чтоб они не были больше или равны 1ницы (0 или 1).

Я был сам этому удивлён, когда исследовал работу CollectionView'ров с целью запилить свои с блекджеком и всем остальным.

Короче говоря, в e.NewItems технически не может быть больше 1 элемента, а если они там окажутся, то мы получим исключение
System.NotSupportedException' Additional information: Range actions are not supported.
(при условии, что данная ObservableCollection<T> связана с ItemsControl'ом)

По этому, вся эта возня во круг foreach пустая трата времени, вы ожидаете увидеть там несколько элементов, но их всегда будет меньше 2
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259891
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, это, конечно, недостаток ObservableCollection.

Тем не менее, ты работаешь с интерфейсом IEnumerable, а не с ObservableCollection, поэтому стоит все-таки сделать цикл, чтобы избежать плохообнаруживаемых проблем с потенциальным рефакторингом.

Кстати, я делал обертку над ObservableCollection, которая имеет AddRange и выдает единственный PropertyChanged.
...
Рейтинг: 0 / 0
ListView с checkbox и событие
    #39259943
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДа, это, конечно, недостаток ObservableCollection.

Тем не менее, ты работаешь с интерфейсом IEnumerable, а не с ObservableCollection, поэтому стоит все-таки сделать цикл, чтобы избежать плохообнаруживаемых проблем с потенциальным рефакторингом.

Кстати, я делал обертку над ObservableCollection, которая имеет AddRange и выдает единственный PropertyChanged.
проблема не в ObservableCollection, а в ItemContainerGenerator'е, создать свою коллекцию имплантирующую INotifyCollectionChanged нет ни каких проблем, но при использовании такой коллекции в качество источника для UI будет ошибка, при вставке более 1 элемента. Так как, когда мы связываем нашу коллекцию со свойством ItemsSource, ItemsControl создает View'у для этой коллекции и задает её в качестве Items, к котором потом подписывается генератор контейнеров. И всё это добро умеет работать только по элементно.

а само событие CollectionChanged поддерживает множественные изменения, для этого там даже конструктор соответствующий есть и в чистом коде, без UI всё должно работать как обычно.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / ListView с checkbox и событие
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]