Sams在24小时内自学WPF:OnChanged事件的结果不一致

时间:2012-09-27 03:17:39

标签: wpf xaml data-binding

我刚刚开始使用WPF,并且一直在阅读“ Sams教你自己WPF ”。在第6章中,它介绍了绑定到后面代码中的属性,如下所示。这种方法对我来说是不成功的。

在我目前的项目中,此方法适用于两个双打,其值与标签绑定。当我尝试使用相同的方法将bool绑定到MenuItem的IsEnabled属性时,该方法失败。

然后我回到书中的简单示例,并将属性类型从String更改为bool。在这种情况下,我能够将bool绑定到Button和TextBox。

我注意到当此方法失败时,OnHhanged函数中的EventHandler始终为null。我错过了什么?

private String _myString;
public String MyString
{
     get { return _myString; }
     set 
     {   
          _myString = value;
          OnMyStringChanged();
     }
}

public event EventHandler MyStringChanged;

private void OnMyStringChanged()
{
     if (MyStringChanged != null)
          MyStringChanged(this, EventArgs.Empty);
}

我的MainWindow类中有以下XAML。在MainWindow的构造函数中,我将DataContext设置为包含MyString的类的新实例。

<TextBox Text="{Binding Path=MyString, Mode=TwoWay}"
         Margin="4"/>
<Button Grid.Row="1"
        Height="40"
        Margin="4"
        Click="Button_Click"
        Content="{Binding Path=MyString, Mode=TwoWay}"/>

2 个答案:

答案 0 :(得分:1)

您面临的问题是,实例化表单副本的代码需要向&#34; MyStringChanged&#34;注册一个监听器。事件

检查您声明表单实例的位置: 即。

var myForm = new TestForm();
TestForm.Show();

您需要添加:

var myForm = new TestForm();
myForm.MyStringChanged += someHandlingMethod;
TestForm.Show();

样本中应该提到类似的东西。

老实说虽然它不是我读过的很好的样本。他们正在使用WPF制作WinForm风格的应用程序。要学习WPF,您需要关注MVVM。那肯定不是一个24小时的任务。执行上述操作您也可以构建一个WinForm应用程序,它将为您节省很多麻烦。

答案 1 :(得分:0)

问题出在我身上。我在XAML绑定路径中拼错了变量名。如果绑定路径无效,我期望收到编译器警告或异常。即使将绑定模式更改为“TwoWay”也不会产生任何警告或运行时异常与不存在的绑定路径。抱歉浪费你的时间。