私はMVVM、VS 2008、および.NET 3.5 SP1を使用しています。アイテムのリストがあり、それぞれがIsSelectedプロパティを公開しています。 CheckBoxを追加して、リスト内のすべてのアイテムの選択/選択解除(各アイテムのIsSelectedプロパティの更新)を管理しました。 CheckBoxのバインドされたコントロールのPropertyChangedイベントが発生したときに、IsCheckedプロパティがビューで更新されていないことを除いて、すべてが機能しています。WPF CheckBoxバインディングが機能しないのはなぜですか?
<CheckBox
Command="{Binding SelectAllCommand}"
IsChecked="{Binding Path=AreAllSelected, Mode=OneWay}"
Content="Select/deselect all identified duplicates"
IsThreeState="True" />
マイ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");
}
}
私はここSelectAllCommandまたは個々の項目選択の実装を示していないんだけど、関連していないようです。ユーザーがリスト内の単一の項目を選択するか(または問題のCheckBoxをクリックしてすべての項目を選択/選択解除する)、OnPropertyChanged( "AreAllSelected")コード行が実行され、デバッガでのトレースが確認できますPropertyChangedイベントは購読されており、期待どおりに起動します。しかし、AreAllSelectedプロパティのgetは、ビューが実際にレンダリングされたときに一度だけ実行されます。 Visual Studioの出力ウィンドウはデータバインディングエラーを報告しないので、私が知る限り、CheckBoxのIsSelectedプロパティは正しくバインドされています。
私はボタンが付いたチェックボックス交換する場合:
<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>
をして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");
}
すべてが期待通りに動作します - すべての項目が選択されているとして、ボタンのテキストがdesected /更新されます。 CheckBoxのIsSelectedプロパティにバインドされていないものがありますか?
ありがとうございました!