我的尝试(下面)失败了:
<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属性发生更改时更改按钮(它会触发INotifyPropertyChanged.PropertyChanged并将“IsReadOnly”作为PropertyName)。我错过了什么?
.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}}" />
答案 0 :(得分:3)
如果设置按钮的属性“内容”,则无法使用触发器更改它,因为第一个优先。 尝试删除内容的设置,它应该工作,因为触发器将自己做正确的工作。
答案 1 :(得分:0)
你正在使用C#,这意味着布尔值的ToString()方法返回“true”和“false”;而VB.NET则返回“True”和“False。
如果您将触发器更改为使用小写“true”和“false”而不是大写“True”和“False”,则原始代码将起作用。
使用此代码进行测试...
XAML:
<Window.Resources>
<local:ViewModel x:Key="TheViewModel" />
<Canvas x:Key="Lock">
<TextBlock Text="Lock"/>
</Canvas>
<Canvas x:Key="Unlock">
<TextBlock Text="Unlock"/>
</Canvas>
<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>
</Window.Resources>
<Grid DataContext="{StaticResource TheViewModel}">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Button x:Name="LockButton" Style="{StaticResource LockButtonStyle}" />
<Button x:Name="ChangeIsReadOnly" Content="Change State" Grid.Row="1" Click="ChangeIsReadOnly_Click"/>
</Grid>
窗口的C#:
public MainWindow()
{
InitializeComponent();
}
private void ChangeIsReadOnly_Click(object sender, RoutedEventArgs e)
{
ViewModel theViewModel = (ViewModel)FindResource("TheViewModel");
theViewModel.IsReadOnly = !theViewModel.IsReadOnly;
}
ViewModel类的C#:
public class ViewModel : System.ComponentModel.INotifyPropertyChanged
{
public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
private bool isReadOnly;
public bool IsReadOnly
{
get
{
return isReadOnly;
}
set
{
isReadOnly = value;
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("IsReadOnly"));
}
}
}