Warum ist mein WPF-CheckBox-Bindung funktioniert nicht?

Ich bin mit MVVM, VS 2008, und .NET 3.5 SP1. Ich habe eine Liste von items, die jeweils auszusetzen, eine IsSelected-Eigenschaft. Ich habe eine CheckBox zum verwalten der Selektion/de-Selektion aller Elemente in der Liste (Aktualisierung jedes Element der IsSelected-Eigenschaft). Alles funktioniert, außer die IsChecked-Eigenschaft ist nicht in der Ansicht aktualisiert, wenn das PropertyChanged-Ereignis ausgelöst, das Kontrollkästchen gebunden ist, die Kontrolle.

<CheckBox
  Command="{Binding SelectAllCommand}"
  IsChecked="{Binding Path=AreAllSelected, Mode=OneWay}"
  Content="Select/deselect all identified duplicates"
  IsThreeState="True" />

Mein 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");
  }
}

Ich bin nicht die die Umsetzung der SelectAllCommand oder einzelne Artikel Auswahl hier, aber es scheint nicht relevant zu sein. Wenn der Benutzer wählt ein Element in der Liste (oder klickt auf das problem Kontrollkästchen zu aktivieren/de-aktivieren Sie alle Elemente), habe ich festgestellt, dass die OnPropertyChanged("AreAllSelected") - Zeile der code ausgeführt wird, und die Ablaufverfolgung im debugger sehen können, wird das PropertyChanged-Ereignis abonniert und nicht wie erwartet ausgelöst. Aber die AreAllSelected Immobilie zu bekommen ist, nur einmal ausgeführt -, wenn die Ansicht tatsächlich gerendert wird. Visual Studio Output Fenster nicht berichten Datenbindung Fehler, also was ich sagen kann, die CheckBox IsSelected-Eigenschaft ist ordnungsgemäß gebunden.

Wenn ich ersetzen Sie die CheckBox mit einem Button:

<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>

und aktualisieren Sie die 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");
}

alles funktioniert wie erwartet - der button-text wird aktualisiert, wenn alle Elemente aktiviert sind/desected. Gibt es etwas, was ich vermisst über die Bindung auf die CheckBox IsSelected-Eigenschaft?

Vielen Dank für jede Hilfe!!!

InformationsquelleAutor RMart | 2011-07-06

Schreibe einen Kommentar