.net 如果只满足一个条件,则触发MultiDataTrigger

.net 如果只满足一个条件,则触发MultiDataTrigger,.net,wpf,mvvm,datatrigger,multidatatrigger,.net,Wpf,Mvvm,Datatrigger,Multidatatrigger,在我的UserControl中,我有三个组合框,在启用save按钮之前,必须选择所有组合框。我定义了一个MultiDataTrigger,它绑定到最初设置为null的ViewModel属性。因此,当加载控件时,按钮按预期被禁用,但一旦选择其中一个组合框,按钮将被启用。据我所知,多数据触发器的所有条件都必须满足才能触发 以下是我的按钮样式: <Style x:Key="saveButton" TargetType="{x:Type Button}"> &

在我的UserControl中,我有三个组合框,在启用save按钮之前,必须选择所有组合框。我定义了一个MultiDataTrigger,它绑定到最初设置为null的ViewModel属性。因此,当加载控件时,按钮按预期被禁用,但一旦选择其中一个组合框,按钮将被启用。据我所知,多数据触发器的所有条件都必须满足才能触发

以下是我的按钮样式:

        <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>
谢谢,
Paxx

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

现在,当
房间
扬声器
音轨
属性都为空时,触发器将被激活。当程序启动时会发生这种情况,因为在任何一个
组合框中都没有选择任何内容

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

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

因此,要解决这个问题,您应该首先禁用
按钮
,并且只有在转换器为所有绑定返回false时(当3个属性不为null时),才在触发器中将其设置为enabled



您是否尝试过调试?你检查过转换器中的值是否真的为空吗?嗨,Blachshma,我刚检查过。加载窗口时,转换器在所有3种情况下都返回true。如果我选择其中一个,转换器将返回false。看来转换器工作正常。哦,这不是问题所在。它仍然不能正常工作,只有转换器工作正常。只要满足其中一个条件,按钮就会被启用,这不是我想要的。谢谢你的回答,彼得。我在发帖前试过,但如果将按钮设置为disabled,无论我做什么,它都会保持禁用状态。在我最初的帖子中,我保持原样,因为这是唯一可行的方式。但我现在明白了,它不能这样工作。啊,我的坏。。。我忽略了你帖子中设置样式中IsEnabled属性的那一行,我总是试图直接在按钮定义中设置它。现在可以了,谢谢你,彼得!
            <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;
    }
}
<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>