【问题标题】:Exposing Child Control Dependency Properties for Binding in WPF为 WPF 中的绑定公开子控件依赖属性
【发布时间】:2013-12-17 04:22:09
【问题描述】:

我有一个非常简单的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的子元素属性的绑定?

【问题讨论】:

  • 无论如何你都应该使用新的依赖属性。
  • 谢谢。有没有官方的方法可以做到这一点?我读过一本关于 WPF 4 的书,但没有找到任何关于此的内容。我也没有在 MSDN 上找到关于“复制属性”或“暴露依赖属性”的指南。
  • 1.在您的控件后面的代码中创建一个新的 DP,比如说我们称之为文本 2.在您的代码的 xaml 中: 3.确保textBox的DataContext是UserControl
  • 把它复制到记事本或者我不能在这里发消息的东西,不知道为什么
  • 我明白了,谢谢。我想只有绑定应该是 {Binding Text2}。

标签: .net wpf xaml custom-controls dependency-properties


【解决方案1】:

查看Visual Studio的Output窗口中的Debug文本,它会给出数据绑定错误的解释性文本。

【讨论】:

  • 在我的项目中,它说:BindingExpression 路径错误:在 'object' ''CustomTextBox' (Name='CustomTextBox')' 上找不到 'Text' 属性。绑定表达式:路径=文本; DataItem='CustomTextBox' (Name='CustomTextBox');目标元素是'TextBox'(名称='');目标属性是“文本”(类型“字符串”)
  • 它根本无法遍历到“CustomTextBox.InnerTextBox.Text”——它总是取而代之的是“CustomTextBox.Text”。
【解决方案2】:

您可以进行继承。您没有正确创建自定义控件。在 Wpf Coustom Control 中有两个部分

  1. C# 部分->控件的行为。在 C# 部分你可以做继承
  2. Xaml Part->控件的 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 的控件 - 只有带有代码隐藏的控件,请参阅 stackoverflow.com/questions/269106/…
  • 在我的项目中,基础控件和派生控件都是具有 XAML 和代码隐藏的自定义控件...
【解决方案3】:

1.在您的控件后面的代码中创建一个新的 DP,比如说我们称之为 Text
2.在您的代码中的 xaml 中:

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


3.确保textBox的DataContext是UserControl

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-01
    • 2012-11-08
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 2014-08-31
    相关资源
    最近更新 更多