【问题标题】:Help with some very basic WPF databinding帮助一些非常基本的 WPF 数据绑定
【发布时间】:2009-05-16 16:57:27
【问题描述】:

我是 WPF 新手,正在尝试一个简单的数据绑定示例,但它不起作用。 我的窗口有一个 TextBlock,我将它绑定到窗口对象的一个​​属性。 我在代码中声明了该属性。

运行此程序时,我看到 TextBlock 中出现了正确的值。 还有一个按钮,单击该按钮会更新属性,但我没有看到这会影响 TextBlock。

据我所知,我正确实施了 INotifyPropertyChanged。我还看到,在调试时,something 订阅了 PropertyChanged 事件,但它似乎没有做任何事情。

我有两个问题:

1) 为什么没有按预期工作?

2) 是否有任何简单的方法可以在运行时调试导致这种情况的原因,而无需借助第三方工具?根据我粗略的了解,在我看来,WPF 中的调试支持非常缺乏。

XAML 是(不包括“标准”XAML 窗口元素):

<TextBlock Height="28" Name="label1" VerticalAlignment="Top"
       Text="{Binding Path=TheName}"
       Grid.Row="0"
       ></TextBlock>
<Button Height="23" Name="button1" VerticalAlignment="Stretch" Grid.Row="1"
Click="button1_Click">
    Button
</Button>

window类中的代码是:

    public partial class Window1 : Window
    {
        protected MyDataSource TheSource { get; set; }

        public Window1()
        {
            InitializeComponent();
            TheSource = new MyDataSource();
            TheSource.TheName = "Original";  // This works
            this.label1.DataContext = this.TheSource;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            TheSource.TheName = "Changed";  // This doesn't work
        }
    }
    public class MyDataSource : INotifyPropertyChanged
    {
        string thename;
        public string TheName 
        {
            get { return thename; }
            set { thename = value; OnPropertyChanged(thename); }
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }
    }
}

【问题讨论】:

    标签: wpf data-binding xaml


    【解决方案1】:

    问题在于您的“TheName”属性设置器。 OnPropertyChanged 方法调用传递的是“thename”的,而不是“thename”的“名称”。 (抱歉,如果这没有意义 - 示例中使用的变量名与我们合谋!)

    正确的代码是:

    string thename;
    public string TheName 
    {
      get { return thename; }
      set { thename = value; OnPropertyChanged("TheName"); }
    }
    

    Here 是来自MSDN 的示例。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      来自Bea Stollnitz 博客,这里有一些调试 WPF 绑定的方法。

      • 检查输出窗口,因为 WPF 在那里记录了很多错误

      • 您可以将 Trace 源添加到您的 app.config。 Mike Hillberg’s blog的详细信息

      • 向绑定添加跟踪级别(这是我最喜欢的)。添加命名空间xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase"
        并在您的绑定中添加跟踪级别
        &lt;TextBlock Text="{Binding Path=TheName, diagnostics:PresentationTraceSources.TraceLevel=High}" /&gt;

      • 将转换器添加到您的绑定中,然后在转换器中放置断点。

      【讨论】:

        【解决方案3】:

        好的,谢谢,我在阅读有关 PropertyChangedEventArgs 参数时没有给予足够的关注。 依赖字符串作为属性名称似乎是脆弱的设计,但显然其他人也这么认为(来自您链接到的 MSDN 页面上用户 cmets 底部的链接)。

        但是,我的第二个问题仍未得到解答:我如何调试它并找出我做错了什么?

        例如,WPF 不会以某种形式记录其操作吗?它应该注意到我在这个对象上没有一个名为“Changed”的属性,为什么它不引发异常或至少向调试控制台写入一些东西?

        【讨论】:

        • 我目前在 PropertyChanged 事件上使用扩展方法来引发“强类型”属性更改事件。此方法在以下链接中作为“选项 3”进行讨论:orkpad.com/Blog/post/2009/04/12/… 请注意,在运行时可能会有一些影响。衡量它是否对您很重要。
        猜你喜欢
        • 1970-01-01
        • 2011-09-28
        • 2010-11-17
        • 1970-01-01
        • 2011-10-13
        • 2011-07-19
        • 1970-01-01
        • 2011-11-22
        • 1970-01-01
        相关资源
        最近更新 更多