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 속성이 올바르게 바인딩되었습니다.
가 나는 버튼과 CheckBox에 교체하는 경우 :
<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 속성에서 바인딩에 대해 놓친 부분이 있습니까?
도움 주셔서 감사합니다.