【问题标题】:WPF Dependency Property -Databinding doesn't workWPF 依赖属性 - 数据绑定不起作用
【发布时间】:2011-08-09 09:53:18
【问题描述】:

正如标题所说,我在使用具有 DependencyProperty 的数据绑定时遇到了问题。我有一个名为 HTMLBox 的类:

public class HTMLBox : RichTextBox
{
    public static readonly DependencyProperty TextProperty = 
    DependencyProperty.Register("Text", typeof(string), typeof(HTMLBox));

    public string Text
    {
        get
        {
            return GetValue(TextProperty) as string;
        }
        set
        {
            Console.WriteLine("Setter...");
            SetValue(TextProperty, value);
        }
    }

    public HTMLBox()
    {
        // Create a FlowDocument
        FlowDocument mcFlowDoc = new FlowDocument();

        // Create a paragraph with text
        Paragraph para = new Paragraph();
        para.Inlines.Add(new Bold(new Run(Text)));

        // Add the paragraph to blocks of paragraph
        mcFlowDoc.Blocks.Add(para);

        this.Document = mcFlowDoc;
    }
}

我在构造函数中读取文本属性,因此当字符串绑定到属性时,它应该显示为文本。但即使我将一些数据绑定到 xaml 中的 Text 属性,我什至看不到设置 Text 属性时应该显示的“Setter...”-Message。

    <local:HTMLBox Text="{Binding Text}" 
           Width="{Binding Width}"  
           AcceptsReturn="True" 
           Height="{Binding Height}" />

如果我将 HTMLBox 更改为 TextBox,则文本会正确显示,因此错误可能出在我的 HTMLBox 类的某个地方。我做错了什么?

【问题讨论】:

    标签: c# wpf data-binding dependency-properties


    【解决方案1】:

    您在这里遇到了一些问题:

    1. 您不应将逻辑放在包装了依赖项属性的 CLR 属性的 set/get 中。这个属性只是为了提供一个更方便的机制来获取/设置你的依赖属性。不能保证 XAML 解析器将调用此设置器。如果您需要在更改依赖项属性时调用任何逻辑,请在通过 DependencyProperty.Register 注册依赖项属性时通过更改事件处理程序执行此操作。
    2. 您在构造函数中构建控件的 UI,这里有计时问题!要构造类的实例,首先调用构造函数,然后设置各种属性。 Text 将始终是构造函数中的默认值。同样,与 (1) 类似的解决方案是,当您的 Text 属性更改时,重建/更新您的 UI。

    【讨论】:

    • 谢谢,使用更改事件处理程序解决了这个问题。看来我在这里有很多东西要学:)
    猜你喜欢
    • 1970-01-01
    • 2017-07-19
    • 1970-01-01
    • 2012-06-24
    • 2012-11-08
    • 2010-10-09
    • 1970-01-01
    • 2014-11-19
    • 1970-01-01
    相关资源
    最近更新 更多