绑定兄弟控件并在转换器中使用它

时间:2018-06-07 11:56:43

标签: wpf xaml telerik

假设我有工作代码。

  <StackPanel>
    <TextBox x:Name="txt" Text="{Binding MyText}"/>
    <TextBlock Text="Some text" Visibility="{Binding Text, ElementName=txt, Converter={StaticResource BooleanToVisibilityConverter}}"/>
  </StackPanel>

它绑定TextBox的属性。但是现在我想绑定TextBox控件本身而不是属性本身然后在转换器中使用它。原因是我想在转换器中获取TextBox的LineCount属性。

我们可以吗?

更新

实际上TextBox在GridViewColumn中。

<telerik:GridViewColumn>
    <telerik.GridViewColumn.CellTemplate>
          <DataTemplate>
              <TextBox....

1 个答案:

答案 0 :(得分:0)

LineCount属性不仅会在您更改TextBox的文本时更改其值,还会在TexBox的布局更改(例如维度)时更改其值。这取决于TextWrapping的{​​{1}}属性。

如果你想要一个可重用且完整的解决方案,我建议你为TextBox创建一个Behavior,公开你可以绑定的可观察依赖属性。

以下是此类行为的示例:

TextBox

一个用法示例:

class LineCountBehavior : Behavior<TextBox>
{
    public static readonly DependencyProperty LineCountProperty =
        DependencyProperty.Register(
            "LineCount",
            typeof(int),
            typeof(LineCountBehavior),
            new PropertyMetadata(0));

    public int LineCount
    {
        get { return (int)GetValue(LineCountProperty); }
        set { SetValue(LineCountProperty, value); }
    }    

    protected override void OnAttached()
    {
        AssociatedObject.LayoutUpdated += LineCountChanged;
        AssociatedObject.TextChanged += LineCountChanged;
    }    

    protected override void OnDetaching()
    {
        AssociatedObject.LayoutUpdated -= LineCountChanged;
        AssociatedObject.TextChanged -= LineCountChanged;
    }

    private void LineCountChanged(object sender, EventArgs e)
    {
        LineCount = AssociatedObject.LineCount;
    }
}