【问题标题】:MultiDataTrigger is firing if only one condition is met如果只满足一个条件,MultiDataTrigger 就会触发
【发布时间】:2012-12-15 00:22:00
【问题描述】:

在我的 UserControl 中,我有三个 ComboBoxes,必须在启用保存按钮之前选择它们。我定义了一个 MultiDataTrigger 绑定到我的 ViewModel 属性,这些属性最初设置为 null。因此,当控件加载时,按钮按预期被禁用,但只要选择了其中一个组合框,按钮就会启用。据我了解,必须满足 MultiDataTrigger 的所有条件才能触发?

这是我的按钮样式:

        <Style x:Key="saveButton" TargetType="{x:Type Button}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=CurrentSpeech.Room, Converter={StaticResource nullToBoolConverter}}" Value="true" />
                    <Condition Binding="{Binding Path=CurrentSpeech.Speaker, Converter={StaticResource nullToBoolConverter}}" Value="true" />
                    <Condition Binding="{Binding Path=CurrentSpeech.Track, Converter={StaticResource nullToBoolConverter}}" Value="true" />
                </MultiDataTrigger.Conditions>
                <Setter Property="Button.IsEnabled" Value="False" />
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>

我的组合框:

            <ComboBox Margin="3" Grid.Row="4" Grid.Column="1" ItemsSource="{Binding Path=Rooms, Mode=OneWay}"
                      SelectedItem="{Binding Path=CurrentSpeech.Room, Mode=TwoWay}" DisplayMemberPath="Name"/>
            <ComboBox Margin="3" Grid.Row="5" Grid.Column="1" ItemsSource="{Binding Path=Tracks, Mode=OneWay}"
                      SelectedItem="{Binding Path=CurrentSpeech.Track, Mode=TwoWay}" DisplayMemberPath="Title"/>
            <ComboBox Margin="3" Grid.Row="6" Grid.Column="1" ItemsSource="{Binding Path=Speakers, Mode=OneWay}" 
                      SelectedItem="{Binding Path=CurrentSpeech.Speaker, Mode=TwoWay}" DisplayMemberPath="Name"/>

我的按钮:

                <Button Style="{StaticResource saveButton}" Margin="3" Grid.Row="9" Grid.Column="1" Command="{Binding Path=CurrentSpeech.SaveCommand}" Width="150" HorizontalAlignment="Right" Content="Speichern"/>

还有我的转换器:

    [ValueConversion(typeof(object), typeof(bool))]
public class NullToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        bool result = value == null ? true : false;
        if (parameter != null)
            return !result;
        return result;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value;
    }
}

谢谢, 帕克斯

【问题讨论】:

  • 您是否尝试过调试?您是否检查过转换器中的值是否真的为空?
  • 嗨 Blachshma,我刚刚检查过了。加载窗口时,转换器对所有 3 个条件都返回 true。如果我选择其中之一,转换器将返回 false。所以看起来转换器工作正常。
  • 哦,这不是问题所在。它仍然无法正常工作,只有转换器是。只要满足其中一个条件,按钮就会启用,这不是我想要的。

标签: .net wpf mvvm datatrigger multidatatrigger


【解决方案1】:

触发器似乎工作正常,只是你的逻辑不正确。

按照现在的工作原理,当RoomSpeakerTrack 属性都为空时,触发器将被激活。程序启动时会发生这种情况,因为在 ComboBoxes 中没有选择任何内容。

因此满足所有 3 个条件,触发器将禁用 Button

当您随后在 Rooms 组合框中选择某些内容时,触发器中的第一个条件不再满足,因为 ValueConverter 现在为该绑定返回 false,因此触发器被禁用,这会导致按钮启用。

因此,要解决此问题,您应该首先禁用Button,并且仅在转换器对所有绑定返回 false 时(当 3 个属性不为空时)在触发器中将其设置为启用。

<Style x:Key="saveButton" TargetType="{x:Type Button}">
    <Setter Property="IsEnabled" Value="False"/>
    <Style.Triggers>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Binding="{Binding Path=Room, Converter={StaticResource nullToBoolConverter}}" Value="false" />
                <Condition Binding="{Binding Path=Speaker, Converter={StaticResource nullToBoolConverter}}" Value="false" />
                <Condition Binding="{Binding Path=Track, Converter={StaticResource nullToBoolConverter}}" Value="false" />
            </MultiDataTrigger.Conditions>
            <Setter Property="Button.IsEnabled" Value="True" />
        </MultiDataTrigger>
    </Style.Triggers>
</Style>

【讨论】:

  • 谢谢您的回答,彼得。我在发布之前尝试过,但是如果将按钮设置为禁用,无论我做什么,它都会保持禁用状态。在我最初的帖子中,我保持原样,因为这是它起作用的唯一方式。但我现在明白它不能这样工作。
  • 啊,我的错...我忽略了您在样式中设置 IsEnabled 属性的帖子中的行,我总是尝试直接在按钮定义中设置它。它现在可以工作了,非常感谢彼得!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-04
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多