2014-01-16 128 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(); 
    } 
}