MVVM, VS 2008 ve .NET 3.5 SP1 kullanıyorum. Her biri bir IsSelected özelliğini sergileyen öğelerin bir listesi var. Listedeki tüm öğelerin seçimini/seçimini (her öğenin IsSelected özelliğini güncelleştirerek) yönetmek için bir CheckBox ekledim. PropertyChanged olay CheckBox'un sınır denetimi için çalışırken IsChecked özelliği görünümde güncelleştiriliyor dışında her şey çalışıyor.WPF CheckBox Bağlamam neden çalışmıyor?
<CheckBox
Command="{Binding SelectAllCommand}"
IsChecked="{Binding Path=AreAllSelected, Mode=OneWay}"
Content="Select/deselect all identified duplicates"
IsThreeState="True" />
Benim 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");
}
}
Burada SelectAllCommand veya bireysel öğe seçimi uygulanmasını gösteren değilim ama alakalı görünmüyor. Kullanıcı listedeki tek bir öğeyi seçtiğinde (veya tüm öğeleri seçmek/devre dışı bırakmak için CheckBox'ı tıklattığında), OnPropertyChanged ("AreAllSelected") kod satırının yürütüldüğünü ve hata ayıklayıcısında izlendiğini doğrulayabilirim. PropertyChanged olayı beklendiği gibi abone olur ve bekler. Ancak AreAllSelected özelliğinin getiri, yalnızca görüntü bir kez oluşturulduğunda gerçekleştirilir. Visual Studio'nun Çıktı penceresi herhangi bir veri bağlama hatası bildirmiyor, bu yüzden ne söyleyebilirim, CheckBox'ın IsSelected özelliği düzgün bir şekilde bağlı.
Bir Button ile CheckBox değiştirin:
<Button Content="{Binding SelectAllText}" Command="{Binding SelectAllCommand}"/>
ve VM güncelleme:
...
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");
}
her şey beklendiği gibi çalışır - tüm öğelerin seçildiğinden olarak düğmenin metin desected/güncellenir. CheckBox'ın IsSelected özelliği üzerindeki Bağlama ile ilgili eksik olan bir şey var mı?
Yardımlarınız için teşekkürler!