WPF 多值绑定(MultiBinding)与多属性触发器(MultiTrigger)与多数据触发器(MultiDataTrigger)

MultiBinding

当一个控件的某个属性需要绑定到多个值的时候,需要使用MultiBinding.

例子1

一个文本显示Person的Name和Age

 <TextBlock>
   <TextBlock.Text>
       <MultiBinding StringFormat="{}Name:{0},Age:{1}">
           <Binding Path="Person.Name"></Binding>
           <Binding Path="Person.Age"></Binding>
       </MultiBinding>
   </TextBlock.Text>
</TextBlock>
例子2

在这里插入图片描述
当1,2,3都被选中时,下面的红色框隐藏,不使用后台代码逻辑。
这个时候,使用MultiBinding+MultiValueConverter可实现需求
首先定义多值转换器:

 public class ToVisibilityMultiValueConverter : IMultiValueConverter
 {
      public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
      {
          if (values == null || values.Length != 3) return Visibility.Visible;

          if (values[0] == null || values[1] == null || values[2] == null) return Visibility.Visible;

          return ((bool)values[0] && (bool)values[1] && (bool)values[2]) ? Visibility.Collapsed : Visibility.Visible;
      }

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

XAML如下:

<Window x:Class="MultiBindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:local="clr-namespace:MultiBindingTest"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        Title="MainWindow"
        Width="300"
        Height="250"
        mc:Ignorable="d">
    <Window.Resources>
        <local:ToVisibilityMultiValueConverter x:Key="ToVisibilityMultiValueConverter" />
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="40" />
            <RowDefinition />
        </Grid.RowDefinitions>
        <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal">
            <CheckBox x:Name="chk1" Margin="5" Content="1" />
            <CheckBox x:Name="chk2" Margin="5" Content="2" />
            <CheckBox x:Name="chk3" Margin="5" Content="3" />
        </StackPanel>
        <Rectangle Grid.Row="1" Width="100" Height="100" Fill="Red">
            <Rectangle.Visibility>
                <MultiBinding Converter="{StaticResource ToVisibilityMultiValueConverter}">
                    <Binding ElementName="chk1" Path="IsChecked" />
                    <Binding ElementName="chk2" Path="IsChecked" />
                    <Binding ElementName="chk3" Path="IsChecked" />
                </MultiBinding>
            </Rectangle.Visibility>
        </Rectangle>

    </Grid>
</Window>

MultiTrigger

与Trigger属性对应
当一个或多个控件本身的其他属性的值共同达到某一个条件时,触发一组属性变化。
使用场景:例如鼠标在按钮上且鼠标按下时,按钮的颜色为蓝色

MultiDataTrigger

与DataTrigger对应
当一个或多个DataContext中的值达到某一个条件来触发操作时,需要使用MutiDataTrigger.
使用场景:
例如 一个按钮的DataContext中有一个对象Person,当Person的Name为“Tony”且Age为20时,按钮的背景色为黄色

 <MultiTrigger>
    <MultiTrigger.Conditions>
        <Condition Property="IsMouseOver" Value="true"></Condition>
        <Condition Property="IsPressed"
                   Value="true"></Condition>
    </MultiTrigger.Conditions>
    <MultiTrigger.Setters>
        <Setter Property="Background" Value="blue"></Setter>
    </MultiTrigger.Setters>
</MultiTrigger>
<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Person.Name}"
                   Value="Tony"></Condition>
        <Condition Binding="{Binding Person.Age}"
                   Value="20"></Condition>
    </MultiDataTrigger.Conditions>
    <MultiDataTrigger.Setters>
        <Setter Property="Background"
                Value="Yellow"></Setter>
    </MultiDataTrigger.Setters>
</MultiDataTrigger>
  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值