在WPF中公开子控件依赖属性以进行绑定

7

我有一个非常简单的UserControl,名为CustomTextBox,其XAML如下:

<UserControl x:Class="CustomTextBox" ... >
    <Grid>
        <TextBox x:Name="InnerTextBox"/>
    </Grid>
</UserControl>

现在,当我使用 CustomTextBox 并希望将其中的 InnerTextBox.Text 进行绑定时,它不起作用:
... {Binding ElementName=CustomTextBox, Path=InnerTextBox.Text}

我尝试了另一种方式,但效果不如此方法好:
... {Binding ElementName=CustomTextBox.InnerTextBox, Path=Text}

我知道我可以定义一个名为CustomTextBox.Text的新依赖属性,然后将其绑定到InnerTextBox.Text,但是我计划使用具有许多属性的自定义控件,并且复制所有这些属性以支持绑定非常困难。此外,复制/封装属性意味着每个值都存储两次。
在WinForms中,这只是简单的继承问题,所有属性都可以自动使用。在WPF中,XAML控件的继承不可能,属性也无法访问。
是否有任何简单的方法来设置从某个控件到UserControl的子元素属性的绑定?

1
无论如何,您应该使用新的依赖属性。 - ZSH
谢谢。有没有官方的方法来做这件事?我读了一本关于WPF 4的书,但没有找到任何相关内容。在MSDN上也没有找到有关“复制属性”或“公开依赖属性”的指南。 - Libor
  1. 在您控件的代码后台中创建一个新的DP,我们称其为Text。
  2. 在您的代码中的XAML中: <TextBox x:Name="InnerTextBox" Text={Binding Text}/>
  3. 确保textBox的DataContext是UserControl。
- ZSH
把以下與程式設計相關的內容從英文翻譯成中文。僅返回已翻譯的文字:複製到記事本或其他地方,我無法在此發布消息,不知道為什麼。 - ZSH
“2” 是为了下一步 1.2.3…,但您可以根据需要自行调整。 - ZSH
显示剩余2条评论
3个回答

3

1. 在控件的代码中创建一个新的DP,我们称之为Text
2. 在XAML中使用你的代码:

<TextBox x:Name="InnerTextBox" Text={Binding Text}/> 


3. 确保textBox的DataContext是UserControl。


0

查看 Visual Studio 输出窗口中的调试文本,它会提供有关数据绑定错误的解释性文本。


在我的项目中,它显示:BindingExpression路径错误:“'CustomTextBox'(名称 ='CustomTextBox')”上未找到“对象”'' Text'”属性。 BindingExpression:Path = Text; DataItem ='CustomTextBox'(名称 ='CustomTextBox'); target element是'TextBox'(名称 =' '); target property是'Text'(类型'String')。 - Libor
它无法遍历到“CustomTextBox.InnerTextBox.Text” - 它总是取代为“CustomTextBox.Text”。 - Libor

0

你可以使用继承。你没有正确地创建自定义控件。在 Wpf 自定义控件中有两个部分

  1. C# 部分 -> 控件的行为。在 C# 部分,你可以进行继承
  2. Xaml 部分 -> 控件的 UI 或外观

请参考以下链接获取更多详细信息

http://msdn.microsoft.com/en-us/library/cc295235.aspx

http://www.codeproject.com/Articles/17830/Creating-and-consuming-a-custom-WPF-control

http://www.codeproject.com/Articles/49802/Create-a-WPF-Custom-Control-Part-2

http://wpftutorial.net/HowToCreateACustomControl.html


使用XAML创建的控件无法被继承,只有通过代码创建的控件可以被继承。详见https://dev59.com/NHVC5IYBdhLWcg3whRcw。 - Libor
在我的项目中,基类和派生类控件都是自定义控件,包含XAML和代码后台。 - Libor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接