【问题标题】:How fire trigger when one or multiple property had changed?当一个或多个属性发生变化时如何触发?
【发布时间】:2017-02-03 23:22:36
【问题描述】:

我的 XAML 中有很多组件,当一个或多个组件的值发生更改时,我需要触发触发器。

我不想为每个组件使用一个 PropertyChangedTrigger,我想为所有组件使用一个 Trigger。

谢谢。

【问题讨论】:

    标签: wpf propertychanged


    【解决方案1】:

    是的,使用MultiDataTrigger。以下是链接的 MSDN 文档中有关如何在多个属性上使用它的示例:

    <Window.Resources>
      <c:Places x:Key="PlacesData"/>
    
      <Style TargetType="ListBoxItem">
        <Style.Triggers>
          <DataTrigger Binding="{Binding Path=State}" Value="WA">
            <Setter Property="Foreground" Value="Red" />
          </DataTrigger>    
          <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
              <Condition Binding="{Binding Path=Name}" Value="Portland" />
              <Condition Binding="{Binding Path=State}" Value="OR" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Background" Value="Cyan" />
          </MultiDataTrigger>
        </Style.Triggers>
      </Style>
    
      <DataTemplate DataType="{x:Type c:Place}">
        <Canvas Width="160" Height="20">
          <TextBlock FontSize="12"
               Width="130" Canvas.Left="0" Text="{Binding Path=Name}"/>
          <TextBlock FontSize="12" Width="30"
                     Canvas.Left="130" Text="{Binding Path=State}"/>
        </Canvas>
      </DataTemplate>
    </Window.Resources>
    
    <StackPanel>
      <TextBlock FontSize="18" Margin="5" FontWeight="Bold"
        HorizontalAlignment="Center">Data Trigger Sample</TextBlock>
      <ListBox Width="180" HorizontalAlignment="Center" Background="Honeydew"
        ItemsSource="{Binding Source={StaticResource PlacesData}}"/>
    </StackPanel>
    

    编辑:这不是最干净的解决方案,但你可以这样做something like this. 基本上只要任何属性发生变化,就使用 MultiDataTrigger 来执行。然后,您使用转换器进行简单的空检查(或者在您的情况下,您可能总是返回 true)。这样,您在 MultiDataTrigger 中的值只是 True 而不是特定值。

    【讨论】:

    • 谢谢,但我希望任何值都发生变化的触发触发器,在您的示例中,当条件等于 true 时触发触发器,对吗?
    • 嗯 MultiTrigger 和 MultiDataTrigger 需要特定值,因为它们对参考值进行相等比较。您能更具体地告诉我您要解决的问题吗?你是在使用多个属性来计算一个值还是什么?
    • 是的,当一个或多个文本框发生变化时,我需要在视图模型中触发一个命令来填充列表框
    猜你喜欢
    • 2022-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2011-04-03
    相关资源
    最近更新 更多