我有按鈕:WPF綁定:值
<Button Content="Stop loading" />
在視圖模型我有屬性IsLoaded。我不想寫屬性IsNotLoaded,但我想在IsLoaded = true時使用IsLoaded綁定和禁用按鈕。
如何實現這樣的事情:
<Button Content="Stop loading" IsEnabled="{Binding !IsLoaded}" />
附:如果它比編寫附加屬性更困難,我將使用IsNotLoaded屬性。
我有按鈕:WPF綁定:值
<Button Content="Stop loading" />
在視圖模型我有屬性IsLoaded。我不想寫屬性IsNotLoaded,但我想在IsLoaded = true時使用IsLoaded綁定和禁用按鈕。
如何實現這樣的事情:
<Button Content="Stop loading" IsEnabled="{Binding !IsLoaded}" />
附:如果它比編寫附加屬性更困難,我將使用IsNotLoaded屬性。
雖然轉換器的答案都是有效的,但您可能需要查看另一種方法:指令。
在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"/>
請參見[此SO問題](http://stackoverflow.com/questions/1039636/how-to-bind-inverse-boolean-properties-in-wpf) – Nekresh 2011-01-28 16:27:59