ListView с флажками - PullRequest
       21

ListView с флажками

1 голос
/ 04 ноября 2011

У меня есть список элементов, отображаемых в виде списка.

<ListView ItemsSource="{Binding ListOfSomeItems}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}"/>
            <GridViewColumn Header="Status">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding IsReceived}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

Теперь есть 2 пользовательских случая, которые мне нужно реализовать:

1) Когда пользователь помечает элемент как полученный (флажок проверяется), мне нужно обновить элемент. Как мне привязать проверенное событие к ICommand в моей ViewModel?

2) Когда пользователь пытается удалить полученный флаг (не проверяет флажок), всплывающее окно должно иметь возможность отменить операцию (если кто-то случайно щелкнул флажок) или предоставить примечание по причине. Эта заметка вместе с непроверенным элементом должна быть отправлена ​​на другую ICommand в VM.

Есть предложения?

Заранее спасибо

UPDATE: Моя viewModel реализует INoftiyPropertyChanged, но у меня нет свойства для одного элемента. Свойство вложено в сложный класс: что-то вроде Account.Holders [x] .Requirements [y] .IsReceived.

Ответы [ 4 ]

0 голосов
/ 04 ноября 2011

Поскольку вы привязываете к свойству IsChecked в своем объекте, вы можете просто прослушать событие PropertyChanged для этого объекта и вызвать любой метод, который вам нужен, когда он изменяется.

Например,

// Wireup CollectionChanged in Constructor
public MyVMConstructor()
{
    ListOfSomeItems = new List<SomeItem>();
    ListOfSomeItems.CollectionChanged += ListOfSomeItems_CollectionChanged;
}

// In CollectionChanged event, wire up PropertyChanged event on items
void ListOfSomeItems_CollectionChanged(object sender, CollectionChangedEventArgs e)
{
    if (e.NewItems != null)
    {
        foreach(SomeItem item in e.NewItems)
            item.PropertyChanged += SomeItem_PropertyChanged;
    }
    if (e.OldItems != null)
    {
        foreach(SomeItem item in e.OldItems)
            item.PropertyChanged -= SomeItem_PropertyChanged;
    }
}

// In PropertyChanged, if property was IsReceived then verify and update
void SomeItem_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
    if (e.PropertyName == "IsReceived")
    {
        if (MessageBox.Show("Are you sure?", "Confirm", MessageBoxButtons.YesNo) == DialogResult.Yes)
        {
            var item = sender as SomeItem;
            UpdateSomeItem(item.Id, item.IsReceived);
        }
    }
}
0 голосов
/ 04 ноября 2011
  1. Почему бы просто не связать команду, которая должна быть представлена ​​ViewModel:
<CheckBox 
     Command="{Binding ReceivedStatusChangedCommand}"
     CommandParameter="{Binding ...IsReceived}"
/>

Затем в обработчике команд вы можете проанализировать переданное значение IsReceived в качестве параметра команды.

0 голосов
/ 04 ноября 2011

MVVM решение будет следующим:

  1. Поскольку привязки являются двухсторонними, вам не нужно ничего делать, чтобы ваш объект обновлялся из пользовательского интерфейса.Но если вы хотите, чтобы ваш пользовательский интерфейс обновлялся при изменениях в модели, классы вашей модели должны реализовать INotifyPropertyChanged
  2. Я предполагаю, что это будет сделано в IsReceived setter.Добавьте два поля в класс вашей модели.

public string ValidationError
{ get; set; }

public bool HasValidationError
{ get; set; }

Затем создайте всплывающее окно с ошибкой, которая по умолчанию скрыта.Реализуйте INotifyPropertyChanged в своем классе и привяжите видимость PopUp к HasValidationError, а сообщение во внутреннем TextBlock - ValidationError.

0 голосов
/ 04 ноября 2011

Ваша ViewModel должна реализовывать INoftiyPropertyChanged.Просто прослушайте событие PropertyChanged и ответьте на него.

Редактировать

На основании структуры вашей ViewModel, если учетной записи необходимо ответить на требование, это можетЛучше всего использовать что-то вроде Призм EventAggregator или MVVM Light's Messenger.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...