如何将属性绑定到WPF中仅限getter的CLR属性?

时间:2013-02-27 12:55:05

标签: wpf c#-4.0 dependency-properties

出于某种目的,我想在多行文本框的LineCount发生变化时提出事件 我认为如果将依赖属性绑定到TextBox.LineCount,我可以实现此目的
以下是代码示例

XAML

<local:MyTextBox Margin="5,65,5,5" x:Name="txtBox" 
       AcceptsReturn="True" AcceptsTab="False" 
       MyProperty="{Binding LineCount, RelativeSource={RelativeSource Self}}" />

代码隐藏

public class MyTextBox : TextBox
{
    public MyTextBox()
    {
        DataContext = this;
    }

    public int MyProperty
    {
        get
        {
            return (int)this.GetValue(LineCountProperty);
        }
        set
        {
            this.SetValue(LineCountProperty, value);
        }
    }

    public static readonly DependencyProperty LineCountProperty =
        DependencyProperty.Register(
        "MyProperty",
        typeof(int),
        typeof(TextBox),
        new FrameworkPropertyMetadata(
            new PropertyChangedCallback(
             (dp, args) => { MessageBox.Show(args.NewValue.ToString()); })
        ));
}

仅在加载表单时显示消息框,而不是在行计数更改后显示消息框。
但是,如果我将MyProperty的绑定从TextBox的LineCount更改为Text 每次文本更改时都会触发PropertyChangedEvent。
我相信我可以从TextChanged事件处理程序中激活一些自定义的LineCount更改事件,但我希望通过DepedencyProperties执行此操作,因为我相信它会更有效。

1 个答案:

答案 0 :(得分:2)

问题是LineCount不是依赖属性,请参阅MSDN documentation。因此,它不支持绑定,也不会提供更改通知。

考虑到您正在制作自定义控件,您真的需要使用绑定吗?为什么不在内部处理TextChanged事件并检测行数何时手动更改。