2012-12-30 139 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

相關問題