Używam MVVM, VS 2008 i .NET 3.5 SP1. Mam listę przedmiotów, z których każda eksponuje właściwość IsSelected. Dodałem CheckBox, aby zarządzać wyborem/anulowaniem wyboru wszystkich pozycji na liście (aktualizując właściwość IsSelected każdej pozycji). Wszystko działa, z tym wyjątkiem, że właściwość IsChecked nie jest aktualizowana w widoku, gdy zdarzenie PropertyChanged jest uruchamiane dla kontrolki kontrolnej CheckBox.Dlaczego moje powiązanie CheckBox WPF nie działa?
<CheckBox
Command="{Binding SelectAllCommand}"
IsChecked="{Binding Path=AreAllSelected, Mode=OneWay}"
Content="Select/deselect all identified duplicates"
IsThreeState="True" />
My VM:
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");
}
}
nie jestem pokazujący realizację SelectAllCommand lub indywidualnego wyboru pozycji, ale to nie wydaje się być istotne. Gdy użytkownik wybierze pojedynczą pozycję na liście (lub kliknie przycisk CheckBox, aby wybrać/odznaczyć wszystkie elementy), sprawdziłem, czy linia kodu OnPropertyChanged ("AreAllSelected") jest wykonywana, a śledzenie w debugerze Zdarzenie PropertyChanged zostało zasubskrybowane i jest uruchamiane zgodnie z oczekiwaniami. Jednak pobieranie właściwości AreAllSelected jest wykonywane tylko raz - kiedy widok jest faktycznie renderowany. Okno wyjściowe programu Visual Studio nie zgłasza żadnych błędów powiązania danych, więc z tego co wiem, właściwość IsSelected CheckBox jest poprawnie powiązana.
Gdybym wymienić CheckBox z przyciskiem:
<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>
i zaktualizować VM:
...
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");
}
wszystko działa zgodnie z oczekiwaniami - tekst przycisku jest aktualizowany jak wybierane są wszystkie elementy/desected. Czy jest coś, czego mi brakuje w powiązaniu na właściwości IsSelected CheckBox?
Dzięki za pomoc!