如何将父UIElement绑定到附加属性?

时间:2014-09-12 12:22:23

标签: c# wpf

我正在开发一种屏幕键盘,用于自助服务终端风格的应用程序。我正在构建它,我希望我的屏幕键盘能够显示用户使用键盘输入的任何文本的预览。

在xaml中我希望在我的应用程序中添加一个附加属性来输入字段控件,例如TextBox或ComboBox。我希望我的OnScreenKeyboard上的预览控件绑定到它所附加的底层控件的相同值。因此,如果用户点击TextBox,屏幕键盘上的预览也是TextBox,并且还绑定到与TextBox相同的基础值,例如, TextBox.Text。

On Screen Keyboard

我上面提供的图片是键盘的外观。因为键盘本身是固定位置的弹出窗口(屏幕的底部中心),键盘可能会覆盖用户点击以召唤键盘的输入控件(TextBox,PasswordBox,ComboBox,RichTextBox等...),因此需要将预览作为键盘的一部分。

我知道在xaml中我可以创建一个附加属性,例如

<TextBox Text="{Binding Path=Entity.TextValue}" OSK.PopupKeyboard.UIElementControl="{How do I bind this to this parent control?}"/>

我想要做的是将父控件(如文本框)传递给键盘,将键盘顶部的预览栏设置为与用户单击的基础控件具有相同绑定的相同类型要召唤键盘。这样,输入到键盘预览中的值将反映在用户单击以首先召唤键盘的控件上。我还认为它将允许键盘灵活使用可用于召唤它的控件类型。

1 个答案:

答案 0 :(得分:0)

所以我已经弄明白在这个例子中我需要做些什么。我需要创建一个FrameworkElement类型的依赖项属性。在我的屏幕键盘UserControl我需要一个ContentControl来保存FrameworkElement类型。当然,您必须断开FrameworkElement与其原始父级的连接,因为它不能在可视树中多次存储,存储父级,将其附加到新父级(ContentControl),然后在您完成后重新连接它是原来的父母。

    public static readonly DependencyProperty FrameworkElementProperty =
            DependencyProperty.RegisterAttached("FrameworkElement",
            typeof(FrameworkElement),
            typeof(PopupKeyboard),
            new FrameworkPropertyMetadata(default(FrameworkElement),
                new PropertyChangedCallback(PopupKeyboard.OnFrameworkElementChanged)));

        [AttachedPropertyBrowsableForType(typeof(FrameworkElement))]
        public static FrameworkElement GetFrameworkElement(DependencyObject element)
        {
            if (element == null)
                throw new ArgumentNullException("element");

            return (FrameworkElement)element.GetValue(FrameworkElementProperty);
        }

        public static void SetFrameworkElement(DependencyObject element, bool value)
        {
            if (element == null)
                throw new ArgumentNullException("element");

            element.SetValue(FrameworkElementProperty, value);
        }

private static void OnFrameworkElementChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            FrameworkElement fe = d as FrameworkElement;
            if (fe != null)
            {
                // detach here
                keyboard.FrameworkElement = fe;
            }
        }

如果我想绑定一个控件,如TextBox,ComboBox等,我可以按如下方式使用标记:

<TextBox Content="{Binding Entity.Value}" local:PopupKeyboard.FrameworkElement="{Binding RelativeSource={RelativeSource Self}}" />