2014-01-16 161 views
15

我有,我想基於關閉的2個依賴屬性隱藏或顯示畫布:設置可見

IsPropA 
IsPropB 

如果這些都是真的,我想在畫布上顯示。如果兩者都是錯誤的,我希望隱藏Canvas。

我知道如何才能做到只有一個屬性。但我不確定如何使用多個屬性來完成它。

<Canvas Grid.Row="2" x:Name="sesimicTeam" Visibility="{Binding IsPropA}"> 
+0

解決方法:創建第三個屬性,把你的邏輯顯示有帆布。 – Eugene

回答

23

你可以使用MultiDataTrigger

<Canvas Grid.Row="2" x:Name="sesimicTeam"> 
    <Canvas.Style> 
     <Style> 
      <Setter Property="Control.Visibility" Value="Visible" /> 
      <Style.Triggers> 
       <MultiDataTrigger> 
        <MultiDataTrigger.Conditions> 
         <Condition Binding="{Binding Path=IsPropA}" Value="false" /> 
         <Condition Binding="{Binding Path=IsPropB}" Value="false" /> 
        </MultiDataTrigger.Conditions> 
        <Setter Property="Control.Visibility" Value="Hidden" /> 
       </MultiDataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Canvas.Style> 
</Canvas> 

現在它會顯示你的畫布,如果你的屬性之一是真的

+0

是的,這是答案。 – webdad3

8

您可以使用風格,兩個觸發器實現這一目標:

<Canvas Grid.Row="2" x:Name="sesimicTeam"> 
     <Canvas.Style> 
      <Style TargetType="Canvas"> 
       <Setter Property="Visibility" Value="Collapsed"/> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsPropA}" Value="True"> 
         <Setter Property="Visibility" Value="Visible"/> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding IsPropB}" Value="True"> 
         <Setter Property="Visibility" Value="Visible"/> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Canvas.Style> 
    </Canvas> 
+0

是這樣的。 – webdad3

12

你可以用IMultiValueConverter來做到這一點。該接口接受任意數量的綁定並返回單個值。

XAML

<Canvas> 
    <Canvas.Resources> 
     <converter:BooleanToVisibilityMultiConverter x:Key="BooleanToVisibilityMultiConverter" /> 
    </Canvas.Resources> 
    <Canvas.Visibility> 
     <MultiBinding Converter="{StaticResource BooleanToVisibilityMultiConverter}"> 
      <Binding Path="IsPropA" /> 
      <Binding Path="IsPropB" /> 
     </MultiBinding> 
    </Canvas.Visibility> 
</Canvas> 

C#

public class BooleanToVisibilityMultiConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     return values.OfType<bool>().Any(b => b) ? Visibility.Visible : Visibility.Hidden; 
    } 

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