2013-02-27 53 views
2

对于一些目的,我想只要一个多行TextBox的LineCount改变
我想我可以做到这一点,如果我依赖项属性绑定到TextBox.LineCount
下面引发一个事件是代码示例
如何将属性绑定到WPF中的仅限getter的CLR属性?

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 eventhandler中触发一些自定义的LineCount更改事件,但是我想通过DepedencyProperties来做到这一点,因为我相信它会更有效率。

回答

2

问题是LineCount不是依赖属性,请参阅MSDN documentation。由于这个原因,它不支持绑定,并且不会提供更改通知。

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

+0

难道你不能绑定到任何属性?我认为只有目标必须是DP。 – Alan 2013-02-27 14:47:44

相关问题