2011-01-28 16 views
18

:ViewModelにでWPFバインディング:!私はボタン持つ値

<Button Content="Stop loading" /> 

iはプロパティIsLoadedを持っています。私はプロパティIsNotLoadedを書いてはいけないが、IsLoaded = trueのときにIsLoadedをバインドして無効にするボタンを使いたい。

<Button Content="Stop loading" IsEnabled="{Binding !IsLoaded}" /> 

P.S.:このような何かを実装する方法

追加プロパティの記述よりも難しい場合は、IsNotLoadedプロパティを使用します。

+2

[このような質問を参照してください](http://stackoverflow.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf) – Nekresh

答えて

11

コンバーターの回答はすべて有効ですが、別の方法論を参照してください。

WPF(ややSilverlight)では、ICommandをそのボタンにバインドできます。だから、あなたが作成した場合、以下のように、あなたのViewModelに、ICommandのを実装しCancelLoadingCommandというプロパティに、あなたがボタンをバインドしたい:

<Button Content="Stop Loading" Command="{Binding CancelLoadingCommand}" /> 

CancelLoadingCommandの実装は、あなたのViewModelでは、次のようになります。

public ICommand CancelLoadingCommand 
    { 
     get 
     { 
      if (_cancelLoadingCommand== null) 
      { 
       this._cancelLoadingCommand= new RelayCommand(
        delegate 
        { 
         // Cancel the loading process. 
        }, 
        delegate 
        { 
         return !this.IsLoaded; 
        } 
       ); 
      } 

      return _cancelLoadingCommand; 
     } 
    } 

ここでは、RelayCommand(PRISMまたはMVVM-Lightフレームワークの一部)を使用しています。私もそれらの1つを調べることをお勧めします。

こちらがお役に立てば幸いです。

22

標準的な方法は、ブール値を反転させるIValueConverterにすることです。このクラスを作成するのは新しいプロパティを追加するよりも難しく、完全に再利用できます。後で、これを他のバインディングで再利用することができます(!プロパティの多くを持つViewModelを汚染することなく)。

このクラスは、次のようになります。

[ValueConversion(typeof(bool), typeof(bool))] 
public class InvertBoolConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool booleanValue = (bool)value; 
     return !booleanValue; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     bool booleanValue = (bool)value; 
     return !booleanValue; 
    } 
} 

その後、あなたはあなたのリソースにそれを追加します。

<Button Content="Stop loading" 
     IsEnabled="{Binding IsLoaded, Converter={StaticResource invertBoolConverter}}" 
/> 
:あなたはこれを持って

<src:InvertBoolConverter x:Key="invertBoolConverter"/> 

たら、同じようにそれを使用します

7

1つの解決策は、コンバータを使用してブール値を反転させることです。

public class InvertedBoolenConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return !(bool)value; 

    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return !(bool)value; 
    } 
} 

ようなものが続いて結合のどこかのリソースにコンバータを追加し、それを使用する:

<YourUserControl.Resources> 
    <c:InvertedBoolenConverter x:Key="InvertedBoolenConverter" /> 
</YourUserControl.Resources> 

<Button Content="Stop loading" IsEnabled="{Binding IsLoaded,Converter={StaticResource InvertedBoolenConverter}}" /> 
6

あなたは、コンバータを使用します。ここにあなたのためのトリックを行うものがあります。

public class booleaninverter : IValueConverter 
    { 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return !(bool)value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     return !(bool)value; 
    } 
    } 

ので

<Button Content="Stop loading" IsEnabled="{Binding IsLoaded, Converter={StaticResource booleaninverter}" /> 

あなたは、静的あなたのApp.xaml内のリソース、または他のウィンドウ/制御リソースセクションを作ることができるようにあなたのXAMLを書き、それを使用します。もちろん、ローカルの名前空間宣言とそれ以外の宣言をする必要がありますが、これはあなたのために行われたほとんどの作業です。

<local:booleaninverter x:key="booleaninverter"/> 
関連する問題