Wpf:在代码后面设置IsEnabled会破坏样式触发器

本文关键字:样式 触发器 IsEnabled 设置 代码 Wpf | 更新日期: 2023-09-27 18:01:22

我在使用DataTrigger操作控件的IsEnabled属性时遇到了一个问题。通常情况下,它工作得很好,但是当我在视图的Initialized事件中初始化IsEnabled状态时,动态样式化不再工作。

这是我的代码。我把它精简成一个最简单的例子。

为什么会发生这种情况,我能做些什么来允许我通过样式触发器和在后面的代码中初始化它来设置IsEnabled ?

提前感谢!

视图:

(包含一个文本框,应该根据复选框的值启用/禁用)

<Window x:Class="IsEnabled.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Initialized="Window_Initialized">
    <StackPanel Orientation="Vertical">
        <TextBox x:Name="txtTarget" Width="200">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=ToggleValue}" Value="True">
                            <Setter Property="IsEnabled" Value="False" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBox.Style>
        </TextBox>
        <CheckBox x:Name="chkSource" IsChecked="{Binding Path=ToggleValue}" />
    </StackPanel>
</Window>

View Codebehind:

(唯一增加的是实现了Initialized事件,为IsEnabled设置初始状态)

using System;
using System.Windows;
namespace IsEnabled.Views
{
    public partial class MainView : Window
    {
        public MainView()
        {
            InitializeComponent();
        }
        private void Window_Initialized(object sender, EventArgs e)
        {
            txtTarget.IsEnabled = false;
        }
    }
}

ViewModel:

(ViewModelBase包含INotifyPropertyChanged接口的实现)

using System;
namespace IsEnabled.ViewModels
{
    class MainViewModel : ViewModelBase
    {
        private bool _ToggleValue;
        public bool ToggleValue
        {
            get { return _ToggleValue; }
            set
            {
                _ToggleValue = value;
                OnPropertyChanged(this, "ToggleValue");
            }
        }
    }
}

Wpf:在代码后面设置IsEnabled会破坏样式触发器

看看依赖属性值的优先级,以及如何从不同的位置、样式、触发器、动画等改变值。

添加到你的Binding Mode=TwoWay,它应该可以工作了