0

我有一个 WPF 应用程序,我想通过设置一个布尔值来控制代码中多个文本框的 IsEnabled 属性。所以我决定为文本框 IsEnabled 属性添加数据绑定。这是源对象定义:

<Window.Resources>
     <src:QuestionControlsState x:Key="QuestionContorlsState" IsEnabled="True"/>
</Window.Resources>

其中只有一个公共属性“IsEnabled”的“QuestionControlsState”简单类然后我绑定了一些文本框:

<TextBox Name="textBoxQuestion" 
                IsEnabled="{Binding Path=IsEnabled, Source={StaticResource QuestionContorlsState}}">

此时它工作正常,当我更改 Window.Resources 部分中的 IsEnabled 属性时,数据绑定工作。但我想从代码中控制它,所以我得到源对象:

 QuestionControlsState _questionControlsState = (QuestionControlsState)this.FindResource("QuestionContorlsState");

现在,当我尝试设置 _questionControlsState.IsEnabled 时,文本框状态不会改变,现在输出中会出现警告。

4

4 回答 4

2

没有看到你的代码,我猜你的QuestionControlsState类没有实现INotifyPropertyChanged

像这样修改它:

public class QuestionControlsState : INotifyPropertyChanged
{
    private bool isEnabled = true;
    public bool IsEnabled
    {
        get { return isEnabled; }
        set
        {
            isEnabled = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("IsEnabled"));
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

每当您更改属性时,这将触发 PropertyChanged 事件IsEnabled,通知需要刷新的视图。

当然,如果您使用的是 MVVM 模式,那么正确的做法是将所有文本框绑定到ViewModel 中的布尔 IsEnabled 属性,而不是尝试在代码隐藏中查找静态资源……然后,IsEnabled = false在VM 将禁用所有文本框(不需要静态资源)

于 2013-01-14T14:05:09.740 回答
1

请使用 MVVM 模式将数据传递给 XAML 视图并封装视图逻辑并使视图逻辑可测试。

使用MVVM可以很容易地创建一个可观察的属性,该属性可以绑定到控件的 IsEnabled 属性。您只需使用命令将属性更改为 true 或 false 即可启用或禁用该属性。

于 2013-01-14T14:00:57.900 回答
0

谢谢你们,Blachshma 你是对的,我忘了在我的自定义类上实现 INotifyPropertyChanged 接口,现在它可以正常工作了。谢谢!我想到了 MVVM 模式,它看起来很酷,但我刚开始使用 WPF 并想学习基础知识。

于 2013-01-14T14:13:34.410 回答
-2

您可以尝试更改StaticResourceDynamicResource.

你可以在这里找到信息

于 2013-01-14T13:58:40.073 回答