我的尝试(下面)失败了:
<Canvas x:Key="Lock" ... />
<Canvas x:Key="Unlock" ... />
<Style x:Key="LockButtonStyle" TargetType="{x:Type Button}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource Lock}" />
</DataTrigger.Setters>
</DataTrigger>
<DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
<DataTrigger.Setters>
<Setter Property="Content" Value="{StaticResource Unlock}" />
</DataTrigger.Setters>
</DataTrigger>
</Style.Triggers>
</Style>
...
<Button Content="{StaticResource Lock}" />
当ViewModel上的IsReadOnly属性发生更改时,我试图让按钮更改(它将“IsReadOnly”作为PropertyName触发INotifyPropertyChanged.PropertyChanged) . 我错过了什么?
.NET 3.5
答案(至少对我来说 - 不支持一般情况):
我刚刚为布尔属性绑定编写了一个快速转换器 .
[ValueConversion(typeof(bool), typeof(object))]
public class BooleanValueConverter : IValueConverter
{
public object FalseValue { get; set; }
public object TrueValue { get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return (bool)value ? this.TrueValue : this.FalseValue;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
return object.Equals(this.TrueValue, value) ? true : false;
}
#endregion
}
...
<local:BooleanValueConverter x:Key="LockOrUnlock"
TrueValue="{StaticResource Unlock}"
FalseValue="{StaticResource Lock}" />
...
<Button Content="{Binding Path=IsReadOnly,
Converter={StaticResource LockOrUnlock}}" />
2 回答
您正在使用C#,这意味着布尔值的ToString()方法返回“true”和“false”;而VB.NET则返回“True”和“False” .
如果您将触发器更改为使用小写“true”和“false”而不是大写“True”和“False”,则原始代码将起作用 .
测试了这段代码......
XAML:
窗口的C#:
ViewModel类的C#:
如果设置Button的属性"Content",则无法使用触发器更改它,因为第一个优先 .
尝试删除内容的设置,它应该工作,因为触发器将自己做正确的工作 .