Tôi đang sử dụng MVVM, VS 2008 và .NET 3.5 SP1. Tôi có một danh sách các mục, mỗi mục phơi bày một thuộc tính IsSelected. Tôi đã thêm một Hộp kiểm để quản lý việc chọn/bỏ chọn tất cả các mục trong danh sách (cập nhật thuộc tính IsSelected của mỗi mục). Mọi thứ đang hoạt động ngoại trừ thuộc tính IsChecked không được cập nhật trong khung nhìn khi sự kiện PropertyChanged kích hoạt để kiểm soát ràng buộc của CheckBox.Tại sao WPF CheckBox Binding của tôi không hoạt động?
<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");
}
}
Tôi không thấy việc thực hiện SelectAllCommand hoặc lựa chọn mục cá nhân ở đây, nhưng nó dường như không có liên quan. Khi người dùng chọn một mục duy nhất trong danh sách (hoặc nhấp vào vấn đề CheckBox để chọn/bỏ chọn tất cả các mục), tôi đã xác minh rằng dòng mã OnPropertyChanged ("AreAllSelected") thực hiện và truy tìm trong trình gỡ lỗi, có thể thấy sự kiện PropertyChanged được đăng ký và không kích hoạt như mong đợi. Nhưng giá trị của thuộc tính AreAllSelected chỉ được thực hiện một lần - khi chế độ xem thực sự được hiển thị. Cửa sổ Output của Visual Studio không báo cáo bất kỳ lỗi ràng buộc dữ liệu nào, vì vậy từ những gì tôi có thể nói, thuộc tính IsSelected của CheckBox bị ràng buộc đúng cách.
Nếu tôi thay thế các CheckBox với một Button:
<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>
và cập nhật 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");
}
mọi thứ hoạt động như mong đợi - văn bản của nút được cập nhật như tất cả các mục được lựa chọn/desected. Có cái gì tôi đang thiếu về Binding trên tài sản IsSelected của CheckBox?
Cảm ơn bạn đã trợ giúp!