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 事件上更改按钮内容的主要内容,如果未能解决你的问题,请参考以下文章

wpf窗体阴影

wpf窗体添加事件的地方在哪里?

wpf 带参数的用户控件,如何在xaml中引入

WPF 精修篇 Winform 嵌入WPF控件

winform 可以用wpf窗体吗

wpf怎么在遮罩层中加入控件