我有一个WPF应用程序,我想通过设置一个bool来控制代码中几个文本框的IsEnabled属性。所以我决定为文本框IsEnabled属性添加数据绑定。 这是源对象定义:
<Window.Resources>
<src:QuestionControlsState x:Key="QuestionContorlsState" IsEnabled="True"/>
</Window.Resources>
其中'QuestionControlsState'简单类只有一个公共属性'IsEnabled' 然后我绑定一些文本框:
<TextBox Name="textBoxQuestion"
IsEnabled="{Binding Path=IsEnabled, Source={StaticResource QuestionContorlsState}}">
此时它工作正常,当我更改Window.Resources部分数据绑定工作中的IsEnabled属性。 但我想从代码控制它,所以我得到源对象:
QuestionControlsState _questionControlsState = (QuestionControlsState)this.FindResource("QuestionContorlsState");
现在当我尝试设置_questionControlsState.IsEnabled时,文本框状态不会改变,输出中现在有警告。
答案 0 :(得分: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;
}
每当您更改IsEnabled
属性时,都会触发PropertyChanged事件,通知需要刷新的视图。
当然,如果您正在使用MVVM模式,正确的方法是将所有文本框绑定到ViewModel 中的布尔IsEnabled属性 ,而不是试图在代码隐藏中找到静态资源...然后,VM中的一个简单的IsEnabled = false
将禁用所有文本框(不需要静态资源)
答案 1 :(得分:1)
请使用MVVM模式将数据传递到XAML视图并封装视图逻辑并使视图逻辑可测试。
使用MVVM,可以很容易地创建一个可观察的属性,该属性可以绑定到控件的IsEnabled属性。您只需将带有Command的Property更改为true或false即可启用或禁用该属性。
答案 2 :(得分:0)
谢谢大家,Blachshma你是对的我忘了在我的自定义类上实现INotifyPropertyChanged接口,现在它的工作原理应该如此。谢谢!我认为MVVM模式看起来很酷,但我刚开始使用WPF并且想学习基础知识。
答案 3 :(得分:-2)
您可以尝试将StaticResource
更改为DynamicResource
。
您可以找到信息here