2011-02-09 43 views
6

別のComboBoxで選択された項目がある場合に基づいてComboBoxを有効/無効にしたいとします。私はスタイルにトリガーを設定することでそれを動作させることができましたが、それはコンボボックスのための私のカスタムグローバルスタイルをオーバーライドします。私のスタイルを失うことなく同じ機能を得る別の方法はありますか?SelectedItemに基づいてComboBoxのIsEnabledプロパティを設定する

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       ItemsSource="{Binding Path=AvailableAnalysis}"> 

     <ComboBox.Style> 
      <Style TargetType="{x:Type ComboBox}"> 
       <Setter Property="IsEnabled" Value="True" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding SelectedItem,ElementName=ApplicationComboBox}" Value="{x:Null}"> 
         <Setter Property="IsEnabled" Value="False" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ComboBox.Style> 
    </ComboBox> 
+0

FWIW、これはスタイルで動作しています。すべてがXAMLであるため、コンバーターを使用するのが好ましいです。トリガーがアクティブでないときにIsEnabledをtrueに設定するように設定する必要はありませんでした。私はこの質問に遭遇した人々のためにこれを投稿しているので、スタイルではできないという印象を受けることはありません。 – Kohanz

答えて

9

、あなたはIsEnabledプロパティをバインドすることができます次のように直接値コンバータを使用して:

NullToFalseConverterはfollowsingコンバータのインスタンスへの鍵である
<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       IsEnabled={Binding SelectedItem, ElementName=ApplicationComboBox, Converter={StaticResource NullToFalseConverter}}" 
       ItemsSource="{Binding Path=AvailableAnalysis}"/> 

public class NullToFalseConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return value == null; 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, System.Globalization.CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
+0

NullToFalseConverterへのバインディングを正しく動作させることができません。 「NullToFalseConverter」という名前のリソースが見つかりません。リソース名では大文字と小文字が区別されます。助けて?申し訳ありませんが、私はWPFの初心者です。 -/ – KrisTrip

+3

@KrisTrip実際にどこかでConverterのインスタンスを宣言する必要があります。 @ColinEはそれを 'StaticResource'として参照しています。つまり、次のようなComboBoxが含まれているものは、Resourcesコレクションにエントリが必要です。 ' ' –

+3

Converterの実装が間違っていると思います。 = null>インスタンスを宣言する必要はありません。少なくとも私は1つ持っていないとそれは動作します。 – steffan

5

はい、あなたはあなたのグローバルスタイルを「継承」するBasedOn属性を設定することができます(それは暗黙的でない場合)あなたはグローバルスタイルのキーを設定することができます

<ComboBox Grid.Column="1" Grid.Row="1" 
      Name="AnalysisComboBox" 
      MinWidth="200" 
      VerticalAlignment="Center" HorizontalAlignment="Left" 
      ItemsSource="{Binding Path=AvailableAnalysis}"> 
    <ComboBox.Style> 
     <Style TargetType="{x:Type ComboBox}" 
       BasedOn="{StaticResource {x:Type ComboBox}}"> 
      <Setter Property="IsEnabled" Value="True" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SelectedItem,ElementName=ApplicationComboBox}" Value="{x:Null}"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </ComboBox.Style> 
</ComboBox> 

代わり{StaticResource {x:Type ComboBox}}の。

しかし、この特定のタスクでは、スタイルを定義する必要はありません。あなただけの結合でIsEnabledのプロパティを設定し、ブール値に別のコンボボックスの選択した項目を変換するコンバータを使用することができます:あなたはスタイルを経由してこれを実行する必要はありません

<ComboBox Grid.Column="1" Grid.Row="1" 
       Name="AnalysisComboBox" 
       MinWidth="200" 
       VerticalAlignment="Center" HorizontalAlignment="Left" 
       ItemsSource="{Binding Path=AvailableAnalysis}" 
      IsEnabled="{Binding SelectedItem,ElementName=ApplicationComboBox, Converter={StaticResource NotNullConverter}"/> 
+0

Upvoteも同様に動作します。私はそれが正しいとマークしたので、しかし、コンバータのオプションがきれいだったと決めた。 – KrisTrip

0

あなたは単に「ノーマルを持つことができます"バインディングは、" value exists "=> true、" value is null "=> falseを変更するための値コンバータを使用します。

関連する問題