2015-01-21 5 views
1

을 multibinding :고급 나는 이런 식으로 뭔가를

<Controls:ToggleRectangleButton.Visibility> 
    <MultiBinding Converter="{StaticResource MultiButtonCheckedToVisibilityConverter}"> 
     <Binding ElementName="btDayAndNightsLinesTickets" Path="IsButtonChecked" /> 
     <Binding ElementName="btSchoolSemester" Path="IsButtonChecked" /> 
    </MultiBinding> 
</Controls:ToggleRectangleButton.Visibility> 

MultiButtonCheckedToButtonEnabledConverter의 변환 방법

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    bool visible = false; 
    foreach (object value in values) 
    { 
     if (value is bool) 
     { 
      if ((bool)value == true) visible = true; 
     } 
    } 
    if (visible) 
    { 
     return System.Windows.Visibility.Visible; 
    } 
    else 
    { 
     return System.Windows.Visibility.Hidden; 
    } 
} 

그래서 매개 변수로 전달 버튼의 경우 적어도 하나가 IsButtonChecked 속성을 true로 설정 한 것을 의미 -> 쇼 제어. 그렇지 않으면 숨 깁니다.

나는 몇 가지 기능을 추가하려는, 즉 조건 :

(otherButton.IsChecked가) System.Windows.Visibility.Hidden를 반환하는 경우;

그래서 otherButton이 선택되면 제어를 숨 깁니다 (다른 조건과 독립적으로). 적어도 "otherButtons"중 하나 이상이 선택되어 있으면 -> 숨기기) 1보다 많은 "otherButtons"를 설정할 수 있기를 원합니다.

답변

2

바인딩 순서는 변환기 코드에서 유지됩니다. 색인을 사용하여 object[] values을 확인하고 이에 따라 논리를 구현할 수 있습니다. 예를 들어

:

if((values[0] is bool) && ((bool)values[0])) 
{ 
    //DoSomething 
} 
+0

바인딩의 값으로 버튼을 제공하면 안됩니다. 이러한 바인딩은 버튼의 속성을 절대 수신하지 않기 때문입니다. –

1

이 시도 :

public class MultiButtonCheckedToVisibilityConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     bool visible = false; 
     int trueCount = (int)parameter; 

     for (int i = 0; i < trueCount; i++) 
     { 
      if ((bool)values[i]) 
      { 
       visible = true; 
       break; 
      } 
     } 

     if (visible) 
     { 
      for (int i = trueCount; i < values.Length; i++) 
      { 
       if (!(bool)values[i]) 
       { 
        visible = false; 
        break; 
       } 
      } 
     } 

     if (visible) 
     { 
      return System.Windows.Visibility.Visible; 
     } 
     else 
     { 
      return System.Windows.Visibility.Hidden; 
     } 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

XAML을 :

<Button Content="Test"> 
    <Button.Visibility> 
     <MultiBinding Converter="{StaticResource MultiButtonCheckedToVisibilityConverter}"> 
      <MultiBinding.ConverterParameter> 
       <sys:Int32>2</sys:Int32> 
      </MultiBinding.ConverterParameter> 
      <Binding ElementName="btDayAndNightsLinesTickets" Path="IsChecked" /> 
      <Binding ElementName="btSchoolSemester" Path="IsChecked" /> 
      <Binding ElementName="btOther1" Path="IsChecked" /> 
      <Binding ElementName="btOther2" Path="IsChecked" /> 
     </MultiBinding> 
    </Button.Visibility> 
</Button> 
<ToggleButton Name="btDayAndNightsLinesTickets">btDayAndNightsLinesTickets</ToggleButton> 
<ToggleButton Name="btSchoolSemester">btSchoolSemester</ToggleButton> 
<ToggleButton Name="btOther1">btOther1</ToggleButton> 
<ToggleButton Name="btOther2">btOther2</ToggleButton> 

아이디어는 컨트롤을 보여줍니다 얼마나 많은 버튼 컨버터을 이야기하는 것입니다. 이 카운트가 상수가 아니면 첫 번째 바인딩으로 개수를 받기 위해 리팩터링 변환기를 사용할 수 있습니다.

관련 문제