2016-11-18 1 views
0

WPF Toolkit에서 CheckListBox를 사용하고 있으며이를 내 ViewModel에 바인딩하려고합니다. 컨트롤에서 선택한 값을 얻는 것 외에도 모든 선택을 지우는 버튼 클릭을 통해 재설정 할 수 있기를 원합니다. 컬렉션의 각 항목에 대해 선택한 상태 나 확인 된 상태를 바인드하는 방법이 달라 붙어 있지만, 전체적인 접근 방식이 꺼져 있으면 그 점에 대해서도 어느 정도 이해할 수 있습니다. 뷰 모델에서 DrugInfluence 개체의 컬렉션라는CheckListBox를 ViewModel에 바인딩하십시오.

public class DrugInfluence : INotifyPropertyChanged 
{ 
    public string Impairment { get; set; } 
    private bool isChecked; 

    public bool IsChecked 
    { 
     get { return isChecked; } 
     set 
     { 
      if(isChecked != value) 
      { 
       isChecked = value; 
       OnPropertyChanged("IsChecked"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 
} 

내가 문자열 설명과 나는 각각의 체크 박스의 상태를 표시하는 데 사용할 계획 부울 속성을 사용하여 간단한 클래스를 만들었습니다

... 나는 CheckListBox 제어 iteself에 바인딩 할 ImpairmentList ...

public List<DrugInfluence> ImpairmentList 
    { 
     get 
     { 
      return impairmentList; 
     } 
     set 
     { 
      if(impairmentList != value) 
      { 
       impairmentList = value; 
       NotifyPropertyChanged("ImpairmentList"); 
      } 
     }    
    } 

그리고 나는 CheckListBox 컨트롤에 뷰 모델을 결합하기 위해 사용하고있어 XAML ...

 <sdk:CheckListBox Margin="6" 
          ItemsSource="{Binding ImpairmentList}" 
          DisplayMemberPath="Impairment" 
          SelectedMemberPath="IsChecked" 
          SelectedItemsOverride="{Binding SelectedImpairments, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
     </sdk:CheckListBox> 

답변

0

this은 사용중인 컨트롤입니까? 그렇다면 SelectedMemberPath는 바인딩하려는 속성입니다. 또한 프로그래밍 방식으로 확인/선택 취소하려는 경우 IsChecked 속성이 변경되면 이벤트를 발생시켜야합니다. 예를 들어,

public class DrugInfluence : INotifyPropertyChanged 
    { 
     public string Impairment { get; set; } 

     private bool _isChecked; 
     public bool IsChecked 
     { 
      get{ return _isChecked;} 
      set 
      { 
       if (_isChecked!= value) 
       { 
        _isChecked= value; 
        OnPropertyChanged("IsChecked"); 
       } 
      }; 
     } 
    } 

그리고는에서 INotifyPropertyChanged 회원

+0

예 즉 컨트롤의 나머지를 구현합니다. 내 접근 방식에 관해서는, 나는 내 ViewModel에서 INotifyPropertyChanged를 구현했으며 DrugInfluence 클래스 자체에서는 구현하지 않았습니다. 저는 당신이 제안한대로 SelectedMemberPath를 내 ViewModel의 DrugInfluence 객체 컬렉션에 대한 IsChecked 속성에 바인딩하려고 할 것이라고 생각했습니다. 인상 이벤트 통지는 돌봐 줄거야 - 내가 이러는거야? – rudeboy

+0

DrugInfluence에서도 INotifyPropertyChanged를 구현해야합니다. ObservableCollection에서 처리 할 수있는 유일한 사항은 항목 소스가 변경된 경우 (즉, 새 목록으로 설정되거나 항목이 추가/제거 된 경우)입니다. 목록의 요소 변경 사항은 자동으로 처리되지 않습니다. – SteveR

+0

IsChecked 속성을 SelectedMemberPath에 바인딩하면 WPF가 해당 속성의 변경 사항을 수신 대기 중입니다. 변경되었음을 알리면 UI 업데이트가 처리됩니다. – SteveR

관련 문제