WPF和数据绑定

时间:2013-01-14 13:52:00

标签: wpf data-binding textbox isenabled

我有一个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时,文本框状态不会改变,输出中现在有警告。

4 个答案:

答案 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