2012-12-30 46 views
0

在我的UserControl中我有三个组合框,在启用保存按钮前必须选择所有组合框。我定义了一个MultiDataTrigger绑定到我的ViewModel属性,它们最初设置为null。因此,当控件加载时,按钮被禁用,但一旦选择了其中一个组合框,该按钮将被启用。根据我的理解,MultiDataTrigger的所有条件必须满足才能启动?如果只有一个条件得到满足,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; 
    } 
} 

谢谢, Paxx

+0

你试过调试吗?你有没有检查你的转换器中的值是否真的是空的? – Blachshma

+0

嗨Blachshma,我刚刚检查。当窗口加载时,转换器在所有3个条件下都返回true。如果我选择其中一个,转换器将返回错误。所以看起来转换器工作正常。 – Paxx

+0

哦,这不是问题。它仍然无法正常工作,只有转换器是。只要满足其中一个条件,按钮将被启用,这不是我想要的。 – Paxx

回答

0

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

因为它现在有效,所以当Room,SpeakerTrack属性都为空时触发器将被激活。程序启动时会发生这种情况,因为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> 
+0

谢谢您的回答。我在发布之前尝试过,但如果将按钮设置为禁用,则无论我做什么,它都会保持禁用状态。在我的第一篇文章中,我保持它的方式,因为这是它工作的唯一方式。但我现在明白,它不能这样工作。 – Paxx

+0

啊我的坏...我忽略了在你的文章中设置样式中的IsEnabled属性的行,我总是试图直接在按钮定义中设置它。它现在有用,谢谢彼得! – Paxx

相关问题