【问题标题】:WPF and data bindingWPF 和数据绑定
【发布时间】:2012-12-28 11:42:34
【问题描述】:

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

【问题讨论】:

    标签: wpf data-binding textbox isenabled


    【解决方案1】:

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

    【讨论】:

      【解决方案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 模式,那么正确的做法是将所有文本框绑定到一个布尔 IsEnabled 属性ViewModel,而不是通过试图在代码隐藏中找到静态资源...然后,VM 中的一个简单的IsEnabled = false 将禁用所有文本框(不需要静态资源)

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          您可以尝试将StaticResource 更改为DynamicResource

          你可以找到信息here

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2023-03-12
            • 2010-09-15
            • 1970-01-01
            • 1970-01-01
            • 2013-05-23
            • 2011-01-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多