【问题标题】:WPF change Button Content on ViewModel.PropertyChanged eventWPF 在 ViewModel.PropertyChanged 事件上更改按钮内容
【发布时间】:2011-03-17 11:26:21
【问题描述】:

我的尝试(如下)失败了:

【问题讨论】:

    标签: .net wpf triggers datatrigger


    【解决方案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"));
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多