2012-04-08 3 views
2

I 플래그 열거 형은이 말을이 -바인딩 플래그 열거 형은

[Flags] 
public enum Department 
{ 
    None = 0, 
    A = 1, 
    B = 2, 
    C = 4, 
    D = 8 
} 

내가보기에이 열거의 값을 보여주고 싶어요. 목록 상자를 만들고이 열거 형 컬렉션에 해당 소스를 바인딩한다고 생각했습니다 List<Department> Departments. 난 내 뷰 모델에 속성에 결합하는 체크 박스를 가지고 생각까지 모두 너무 좋은 작품 -

public Department SelectedDepartments { get; set; } 

솔루션은 여기 http://compilewith.net/2008/12/wpf-flagsenumvalueconverter.html이 체크 박스에 열거 값을 바인딩하지만 체크 박스가 동일 만드는 하나 개의 제한이 우아한 솔루션을 제공합니다 목록의 열거 형 값 수입니다. 하지만 내 경우에는 Enum에 20 개의 값이 포함되어 있으므로 (UI에 20 개의 확인란이있는 것을 의미하므로) 많은 UI가 너무 많아 질 수 없습니다.

MultiBindingConverter을 사용해 보았지만 ConvertBack 메서드에서 실패합니다. 체크 박스 상태를 SelectedDepartments 속성으로 바인딩하고 싶습니다. 속성 값이 "A | B"라면 A와 B 체크 박스를 체크해야하고 C와 D는 체크하지 말아야한다고합니다.

답변

1

코드 숨김을 사용하지 않고이 작업을 수행 할 방법이 없다고 생각합니다.

내가, 당신은 위의 링크 된 시료 용액을했다 MainWindow.xaml에서 체크 박스를 모두 제거, MainWindow.xaml.cs를에 다음 메서드를 추가하고 MainWindow 생성자에서 호출 :

private void AddCheckBoxes() 
    { 
     var converter = new FlagsEnumValueConverter(); 
     foreach (Department dept in Enum.GetValues(typeof(Department))) 
     { 
      if (dept != Department.None) 
      { 
       var binding = new Binding() 
       { 
        Path = new PropertyPath("Department"), 
        Converter = converter, 
        ConverterParameter = dept 
       }; 

       var checkBox = new CheckBox() { Content = dept.ToString() }; 
       checkBox.SetBinding(CheckBox.IsCheckedProperty, binding); 
       DepartmentsPanel.Children.Add(checkBox); 
      } 
     } 
    } 

이를 메서드는 None을 제외한 각 열거 형 상수에 대해 하나씩 모든 확인란을 만드는 작업을 수행합니다. 그런 다음 Department 열거 형에 추가 부서를 추가하고 솔루션을 다시 실행하고 새로 추가 된 부서에 대한 추가 확인란을 볼 수 있습니다.

완전히 해결하려면이 솔루션을 약간 변경해야합니다. 코드를 변경해야 할 수도 있고하지 않을 수도 있습니다. 첫째, 을 구현하는 DataObject 클래스를 만들었습니다.

<StackPanel> 
    <StackPanel x:Name="DepartmentsPanel" /> 
    <TextBlock Margin="5,20,0,0"> 
     <TextBlock Text="Raw Value:" FontWeight="Bold" /> 
     <TextBlock Text="{Binding Department}" /> 
    </TextBlock> 
</StackPanel> 

(기본적으로, 다른 StackPanel에있는 기존 DepartmentsPanel 포장이 외 StackPanel에로 '생값'표시를 옮겼다.) 마지막으로, I가 세트 : 다음 둘째, I는 MainWindow.xaml에서 XAML 재 작성 DataContext가 아닌 DepartmentsPanel이 아닌 전체 MainWindow의 DataContext가 DataObject으로 생성되었습니다. 이 단계는 'Raw Value'디스플레이를 작동시키는 데 필요합니다.

관련 문제