WPF绑定问题与特定属性名称相关

4

我遇到了以下问题。我有一个复选框,它的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的设置访问器从未被调用(即消息框从未显示)。但是,如果我将属性重命名为其他名称(例如IsPressAndHoldEnabled2),它确实有效。
我的问题是:为什么我不能使用IsPressAndHoldEnabled作为我的属性名称?这是否与现有属性Stylus.IsPressAndHoldEnabled有关?

你能在VS输出窗口中看到任何错误吗? - Thomas Levesque
不,没有。我检查了一下类似于“找不到属性”的内容,这种情况通常是因为提供了不存在的属性名称。但是没有出现任何错误。 - Sebastian Krysmanski
2个回答

1

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

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

此外,在同一MainWindow类中从常规属性更改为依赖属性也可以解决问题--依赖属性更改回调会触发。


奇怪。绑定通常不需要源是DP - 它可以是普通对象... - Stephen Chung
好的,我尝试了这个方法,但对我没有起作用。这是我将属性代码更改为的内容: - Sebastian Krysmanski
忘记之前的评论。这是我想说的:好的 - 但是当使用 DP 时,在更改侦听器中执行任何有用操作通常会变得相当复杂,因为依赖属性通常是静态变量。 - Sebastian Krysmanski
DependencyProperty是静态的,但DependencyPropertyChangedCallback的第一个参数是您的对象--您只需将DependencyObject转换为自己的类型,然后可选择调用私有实例PropertyChanged方法。 - foson

1

你是否将双向绑定模式指定为TwoWay?虽然我认为CheckBox.IsChecked默认为TwoWay绑定模式...

我认为你可能搞乱了绑定上下文,导致它找不到IsPressAndHoldEnabled属性。在WPF中,绑定会默默失败——如果你问我的话,这真是一件让人头疼的事情。

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


它默认为双向,并具有默认的bool? -> bool类型转换器。 - foson
如果这是一个问题的话,我重命名属性后它就不会起作用了。 - Sebastian Krysmanski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接