2011-01-28 114 views
18

我有按鈕:WPF綁定:值

<Button Content="Stop loading" /> 

在視圖模型我有屬性IsLoaded。我不想寫屬性IsNotLoaded,但我想在IsLoaded = true時使用IsLoaded綁定和禁用按鈕。

如何實現這樣的事情:

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

附:如果它比編寫附加屬性更困難,我將使用IsNotLoaded屬性。

+2

請參見[此SO問題](http://stackoverflow.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf) – Nekresh 2011-01-28 16:27:59

回答

11

雖然轉換器的答案都是有效的,但您可能需要查看另一種方法:指令。

在WPF(有些在Silverlight中),你可以綁定一個ICommand到那個按鈕。所以,如果你創建你的視圖模型,即實現ICommand的屬性稱爲CancelLoadingCommand,你會綁定按鈕如下:

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

的CancelLoadingCommand在您的視圖模型的實現看起來是這樣的:

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框架的一部分)。我建議你也考慮一下。

我希望這會有所幫助。

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; 
    } 
} 

然後,你將它添加到您的資源:

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

一旦你有了這個,你可以使用它像:

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

一個解決方案是使用轉換器來反轉布爾值。像

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; 
    } 
    } 

要使用它,寫你的XAML像這樣

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

您可以使靜態的資源在你App.xaml中,或其他窗口/控制資源部分。當然,你必須做出'本地'命名空間聲明和什麼不是,但這是你完成的大部分工作。

<local:booleaninverter x:key="booleaninverter"/>