Wpf:在代码后面设置 IsEnabled 中断样式触发器

发布于 2024-11-18 19:32:50 字数 2169 浏览 5 评论 0原文

我在使用 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>

查看代码隐藏:

(唯一的补充是初始化事件的实现,设置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");
            }
        }
    }
}

I am having an issue when using a DataTrigger to manipulate the IsEnabled property of a control. Normally it works fine, however when I initialize the IsEnabled state within the View's Initialized event, the dynamic stylizing no longer works.

Here's my code. I trimmed it down to the simplest example I could.

Why is this occurring, and what can I do to allow me to set IsEnabled both by a style trigger and by initializing it in the code behind?

Thanks in advance!

View:

(Contains a textbox that should be enabled/disabled depending on the value of a checkbox)

<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:

(The only addition is the implementation of the Initialized event setting the inital state for 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 holds the implementation of the INotifyPropertyChanged interface)

using System;

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

窗影残 2024-11-25 19:32:50

查看依赖属性值优先级,以及来自不同位置、样式、触发器、动画等的变化值如何协同工作。

添加到您的 Binding Mode=TwoWay 中,它应该可以工作。

Have a look at dependency property value precedence, and how changing values from different places, Styles, Triggers, Animations etc. work together.

Add to your Binding Mode=TwoWay and it should work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文