WPF 在 ViewModel.PropertyChanged 事件上更改按钮内容
Posted
技术标签:
【中文标题】WPF 在 ViewModel.PropertyChanged 事件上更改按钮内容【英文标题】:WPF change Button Content on ViewModel.PropertyChanged event 【发布时间】:2011-03-17 11:26:21 【问题描述】:我的尝试(如下)失败了:
【问题讨论】:
【参考方案1】:如果您设置了 Button 的“内容”属性,则无法使用触发器更改它,因为第一个优先。 尝试删除 Content 的设置,它应该可以工作,因为触发器自己会做正确的工作。
【讨论】:
您所说的“它应该可以工作”是什么意思?设置内容是我想要完成的。如果你不能用触发器改变它,那么我根本看不出这是怎么可能的。 您的触发器在任何情况下都会设置内容,具体取决于 IsReadOnly 属性的值。您无需在按钮中设置内容。给它样式 LockButtonStyle 看看会发生什么。【参考方案2】:您使用的是 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"));
【讨论】:
以上是关于WPF 在 ViewModel.PropertyChanged 事件上更改按钮内容的主要内容,如果未能解决你的问题,请参考以下文章