2011-07-07 19 views
2

私はWPFの初心者です。チェックボックスがオンの場合、GroupBoxを有効にする構文があります。これは正常に動作します。WPFバインディング宣言構文:チェックボックスが設定されていないときにGroupBoxを有効にします。

IsEnabled="{Binding ElementName=cbIsDeceased, Path=IsChecked}" 

しかし、私は極性を反転する必要があります。チェックボックスがチェックされていない場合はtrue、そうでない場合はIsEnabledをtrueにする必要があります。それを宣言する方法はありますか?

ありがとうございました。

+0

@djacobson、質問タイトルと最初の文を修正してくれてありがとう。 –

答えて

2

ブール値を反転するコンバータを追加する必要があります。 XAMLで 、コンバータのためのリソースを定義し、バインディングに追加します。

IsEnabled="{Binding ElementName=cbIsDeceased, Path=IsChecked, Converter={StaticResource InverseBooleanConverter}"

そして、あなたにいくつかの時間を割くが、私はあなたに非常に簡単ですコンバータの私のバージョンを与える:)

/// <summary> 
/// Converts a boolean to its opposite value 
/// </summary> 
[ValueConversion(typeof(bool), typeof(bool))] 
public class InverseBooleanConverter: IValueConverter 
{ 
    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture) 
    { 
     if (targetType != typeof(bool)) 
      throw new InvalidOperationException("The target must be a boolean"); 

     return !(bool)value; 
    } 

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

    #endregion 
} 
+0

説明とコードをありがとう! –

0

これを完全にXAML(つまりコンバーターなし)で実現するには、CheckBoxのCheckedイベントとUncheckedイベントによってトリガーされるkeフレームベースのアニメーションを使用できます。これはバインディングではなく、GroupBoxを有効にする必要があるかどうかを判断するためにCheckBoxの状態を監視するものはありません。このため、(下の例で示すように)GroupBoxとCheckBoxの初期状態を明示的に設定して、アニメーションが正しく機能するようにする必要があります。ここで

は実施例である:

<Window ...> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
      <RowDefinition Height="Auto" /> 
     </Grid.RowDefinitions> 

     <GroupBox 
      x:Name="targetGroupBox" 
      Grid.Row="0" 
      Header="My GroupBox" 
      IsEnabled="False" 
      > 
      <Button Content="Hello World" /> 
     </GroupBox> 

     <CheckBox 
      Grid.Row="1" 
      Content="Toggle with animation" 
      IsChecked="True" 
      > 
      <CheckBox.Triggers> 
       <EventTrigger RoutedEvent="CheckBox.Checked"> 
        <EventTrigger.Actions> 
         <StopStoryboard BeginStoryboardName="SetFalseStoryboard" /> 
        </EventTrigger.Actions> 
       </EventTrigger> 
       <EventTrigger RoutedEvent="CheckBox.Unchecked"> 
        <EventTrigger.Actions> 
         <BeginStoryboard Name="SetFalseStoryboard"> 
          <Storyboard> 
           <BooleanAnimationUsingKeyFrames 
            Storyboard.TargetName="targetGroupBox" 
            Storyboard.TargetProperty="IsEnabled" 
            AutoReverse="True" 
            BeginTime="0:0:0" 
            FillBehavior="HoldEnd" 
            > 
            <DiscreteBooleanKeyFrame Value="True" KeyTime="0:0:0" /> 
           </BooleanAnimationUsingKeyFrames> 
          </Storyboard> 
         </BeginStoryboard> 
        </EventTrigger.Actions> 
       </EventTrigger> 
      </CheckBox.Triggers> 
     </CheckBox> 
    </Grid> 
</Window> 

このビューが表示されている場合は、「アニメーション」チェックボックスがオフになっているとき、親グループボックス内のボタンのみが有効になっています。これはバインディングではないため、繰り返し実行されるバインディングコンバーターは、キーフレームベースのアニメーションが繰り返し再生されるよりも優れたパフォーマンスを発揮するというパフォーマンス上の問題があります。私は検証するためのパフォーマンステストを行っていません。

WPFにすぐに組み込む必要があると思う機能のためのコンバータの作成と参照が嫌なので、私はこれまでこのようなアニメーションを控えめに使用してきました。しかし、ほとんどの場合、コンバーターが最適です。この例は、キーフレームベースのアニメーションを使用して、XAMLで完全に目的の結果を得ることができるシナリオを示しています。

+0

私にそれを説明する時間をとってくれてありがとう。私はブール値でビットを反転することはWPFがサポートすることを期待していることに同意します。あるいは、少なくとも共通のコンバータを提供する。 –

関連する問題