【发布时间】:2011-03-17 11:26:21
【问题描述】:
我的尝试(如下)失败了:
【问题讨论】:
标签: .net wpf triggers datatrigger
我的尝试(如下)失败了:
【问题讨论】:
标签: .net wpf triggers datatrigger
如果您设置了 Button 的“内容”属性,则无法使用触发器更改它,因为第一个优先。
尝试删除 Content 的设置,它应该可以工作,因为触发器自己会做正确的工作。
【讨论】:
您使用的是 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"));
}
}
}
【讨论】: