Я использую MVVM, VS 2008 и .NET 3.5 SP1. У меня есть список элементов, каждый из которых выставляет свойство IsSelected. Я добавил флажок для управления выбором / отменой выбора всех элементов в списке (обновляя свойство IsSelected каждого элемента). Все работает, за исключением того, что свойство IsChecked не обновляется в представлении, когда происходит событие PropertyChanged для привязанного элемента управления CheckBox.
<CheckBox
Command="{Binding SelectAllCommand}"
IsChecked="{Binding Path=AreAllSelected, Mode=OneWay}"
Content="Select/deselect all identified duplicates"
IsThreeState="True" />
Моя ВМ:
public class MainViewModel : BaseViewModel
{
public MainViewModel(ListViewModel listVM)
{
ListVM = listVM;
ListVM.PropertyChanged += OnListVmChanged;
}
public ListViewModel ListVM { get; private set; }
public ICommand SelectAllCommand { get { return ListVM.SelectAllCommand; } }
public bool? AreAllSelected
{
get
{
if (ListVM == null)
return false;
return ListVM.AreAllSelected;
}
}
private void OnListVmChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AreAllSelected")
OnPropertyChanged("AreAllSelected");
}
}
Я не показываю реализацию SelectAllCommand или выбор отдельных элементов здесь, но это, похоже, не актуально. Когда пользователь выбирает один элемент в списке (или щелкает проблемный флажок для выбора / отмены выбора всех элементов), я убедился, что строка кода OnPropertyChanged ("AreAllSelected") выполняется и отслеживание в отладчике может видеть событие PropertyChanged подписано и запускается, как и ожидалось. Но получение свойства AreAllSelected выполняется только один раз - когда представление фактически отображается. Окно вывода Visual Studio не сообщает об ошибках привязки данных, поэтому, насколько я могу судить, свойство IsSelected в CheckBox правильно связано.
Если я заменю CheckBox на кнопку:
<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>
и обновить виртуальную машину:
...
public string SelectAllText
{
get
{
var msg = "Select All";
if (ListVM != null && ListVM.AreAllSelected != null && ListVM.AreAllSelected.Value)
msg = "Deselect All";
return msg;
}
}
...
private void OnListVmChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "AreAllSelected")
OnPropertyChanged("SelectAllText");
}
все работает как положено - текст кнопки обновляется по мере того, как все элементы выделены / отменены. Что-то мне не хватает в привязке в свойстве IsBelected CheckBox?
Спасибо за любую помощь!