0

在我的 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;
    }
}

谢谢,帕克斯

4

1 回答 1

0

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

Room正如它现在工作的那样,当,SpeakerTrack属性都为空时,触发器将被激活。当程序启动时会发生这种情况,因为在任何一个ComboBoxes.

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

然后,当您在Rooms组合框中选择某些内容时,触发器中的第一个条件不再满足,因为该绑定的ValueConverternow 返回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>
于 2012-12-30T22:33:31.073 回答