.net 如果只满足一个条件,则触发MultiDataTrigger
在我的UserControl中,我有三个组合框,在启用save按钮之前,必须选择所有组合框。我定义了一个MultiDataTrigger,它绑定到最初设置为null的ViewModel属性。因此,当加载控件时,按钮按预期被禁用,但一旦选择其中一个组合框,按钮将被启用。据我所知,多数据触发器的所有条件都必须满足才能触发 以下是我的按钮样式:.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}"> &
<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>