我正在使用MVVM,VS 2008和.NET 3.5 SP1。我有一个项目列表,每个项目都暴露一个IsSelected属性。我添加了一个CheckBox来管理列表中所有项目的选择/取消选择(更新每个项目的IsSelected属性)。一切正常,除非在检查框的绑定控件触发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属性上的Binding的内容?
感谢您的帮助!