【发布时间】:2011-09-29 23:19:27
【问题描述】:
我正在使用 MVVM、VS 2008 和 .NET 3.5 SP1。我有一个项目列表,每个项目都公开一个 IsSelected 属性。我添加了一个复选框来管理列表中所有项目的选择/取消选择(更新每个项目的 IsSelected 属性)。当为 CheckBox 的绑定控件触发 PropertyChanged 事件时,除了 IsChecked 属性未在视图中更新外,一切正常。
<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 或单个项目选择的实现,但它似乎并不相关。当用户选择列表中的单个项目(或单击问题 CheckBox 以选择/取消选择所有项目)时,我已验证 OnPropertyChanged("AreAllSelected") 行代码执行,并在调试器中跟踪,可以看到PropertyChanged 事件被订阅并按预期触发。但是 AreAllSelected 属性的 get 只执行一次 - 当实际呈现视图时。 Visual Studio 的输出窗口没有报告任何数据绑定错误,所以据我所知,CheckBox 的 IsSelected 属性已正确绑定。
如果我用按钮替换 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");
}
一切都按预期工作 - 按钮的文本会随着所有项目的选择/分离而更新。 CheckBox 的 IsSelected 属性上的绑定有什么我遗漏的吗?
感谢您的帮助!
【问题讨论】:
标签: c# wpf data-binding mvvm