WPF绑定问题与某些属性名称

时间:2011-03-22 13:19:06

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

我偶然发现了以下问题。我有一个复选框,其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属性有关?

2 个答案:

答案 0 :(得分:1)

有趣。我没有答案为什么,但我有解决方法:

IsPressAndHoldEnabled属性分隔为单独的ViewModel类,除非该类派生自FrameworkElement。

此外,在同一个MainWindow类中从常规属性更改为Dependency Property - DP更改了回调触发。

答案 1 :(得分:1)

您是否指定了TwoWay作为绑定模式?虽然我认为CheckBox.IsChecked默认为TwoWay绑定模式...

我认为您可能搞砸了绑定上下文,因此找不到IsPressAndHoldEnabled属性。 WPF中的绑定无法默默地 - 如果你问我,就会产生巨大痛苦。

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