【问题标题】:WPF binding problem with certain property names某些属性名称的 WPF 绑定问题
【发布时间】:2011-07-20 11:58:43
【问题描述】:

我偶然发现了以下问题。我有一个复选框,其IsChecked 属性绑定到我的MainWindow 类中的CLR 属性。这是源代码。

隐藏代码 (MainWindow.xaml.cs):

namespace MenuItemBindingTest {
  public partial class MainWindow : Window, INotifyPropertyChanged {
    private bool m_backedVariable = false;
    public bool IsPressAndHoldEnabled {
      get { return this.m_backedVariable; }
      set {
        this.m_backedVariable = value;
        OnPropertyChanged("IsPressAndHoldEnabled");
        MessageBox.Show("Item changed: " + this.m_backedVariable);
      }
    }

    public MainWindow() {
      InitializeComponent();
      this.m_checkbox.DataContext = this;
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string propertyName) {
      if (this.PropertyChanged != null) {
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
      }
    }
  }
}

XAML 代码 (MainWindow.xaml):

<Window x:Class="MenuItemBindingTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Binding Problem Test" Width="525" Height="350">
  <DockPanel>
    <CheckBox x:Name="m_checkbox" 
              IsChecked="{Binding IsPressAndHoldEnabled}"
              HorizontalAlignment="Center" VerticalAlignment="Center"
              Content="Is Press and Hold enabled"/>
  </DockPanel>
</Window>

现在的问题是,当用户选中或取消选中复选框时,属性IsPressAndHoldEnabled 永远不会调用(即消息框永远不会显示)的 set 访问器。但是,当我将属性重命名为其他名称时(例如 IsPressAndHoldEnabled2),它确实有效。

我现在的问题是:为什么我不能使用IsPressAndHoldEnabled 作为我的财产的名称?这与现有的Stylus.IsPressAndHoldEnabled 属性有什么关系吗?

【问题讨论】:

  • 你能看到VS输出窗口有什么错误吗?
  • 不,没有。当您提供一个不存在的属性名称时,我会检查它是否有类似“找不到属性”的内容。但没有错误。

标签: c# .net xaml data-binding binding


【解决方案1】:

有趣。我不知道为什么,但我有解决方法:

IsPressAndHoldEnabled 属性分离到单独的 ViewModel 类是可行的,除非该类是从 FrameworkElement 派生的。

此外,在同一个 MainWindow 类中从常规属性更改为依赖属性是有效的——DP 更改回调会触发。

【讨论】:

  • 奇怪。绑定通常不要求源是 DP——它可以是普通对象...
  • 好吧,我试过了,但对我没有用。这是我将属性代码更改为的内容:
  • 忘记之前的 cmets。这就是我想说的:好的 - 但是当使用 DP 时,在更改侦听器中做任何有用的事情都相当复杂,因为依赖属性通常是一个静态变量。
  • DependencyProperty 是静态的,但 DependencyPropertyChangedCallback 的第一个参数是您的对象——您只需将 DependencyObject 转换为您自己的类型,然后可以选择调用私有实例 PropertyChanged 方法。
【解决方案2】:

您是否将 TwoWay 指定为绑定模式?虽然我觉得CheckBox.IsChecked默认是TwoWay绑定模式...

我认为您可能弄乱了您的绑定上下文,因此它找不到 IsPressAndHoldEnabled 属性。 WPF 中的绑定静默失败——如果你问我,这会很痛苦。

检查复选框是否确实绑定到该属性,并且绑定上下文确实是您的 MainWindodw 类对象。

【讨论】:

  • 它确实默认为双向并具有默认布尔值? -> bool 类型转换器
  • 如果这是一个问题,那么在我重命名该属性之后它就不会起作用了。
猜你喜欢
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2010-10-09
  • 2011-03-10
  • 2011-03-03
  • 2011-09-01
  • 2010-11-11
相关资源
最近更新 更多