WPF绑定:值

WPF绑定:值

问题描述:

我有按钮:WPF绑定:值

<Button Content="Stop loading" /> 

在视图模型我有属性IsLoaded。我不想写属性IsNotLoaded,但我想在IsLoaded = true时使用IsLoaded绑定和禁用按钮。

如何实现这样的事情:

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

附:如果它比编写附加属性更困难,我将使用IsNotLoaded属性。

+2

请参见[此SO问题](http://*.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf) – Nekresh 2011-01-28 16:27:59

虽然转换器的答案都是有效的,但您可能需要查看另一种方法:指令。

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

我希望这会有所帮助。

这样做的标准方法是制作一个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}}" 
/> 

一个解决方案是使用转换器来反转布尔值。像

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}}" /> 

你想用一个转换器。这是一个可以帮助你的技巧。

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"/>