通过DependencyProperty字符串绑定到属性名称

时间:2011-07-12 09:49:54

标签: wpf xaml binding user-controls dependency-properties

我使用UserControl ItemContext创建了DependencyProperty。此属性包含Control的text属性应绑定到的DataContext对象的属性名称。

我无法弄清楚如何在XAML中执行此操作。我尝试了几个步骤,我很近但却找不到它。

这样的事情:

<TextBox Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type me:UserControl}}, Path=ItemContext}" />

但是这里“ItemContext”的内容直接绑定到我不想要的Text属性。 “ItemContext”的内容让我们说“Property1”是我要绑定到的DataContext中属性的名称。

在代码中它的工作原理如下:

this.txtValue0.SetBinding(TextBox.TextProperty, new Binding(this.ItemContext) { Mode = BindingMode.TwoWay });

有人有想法吗?

由于

3 个答案:

答案 0 :(得分:0)

如果我理解正确的话。您想在用户控件xaml中使用后面的usercontrol代码的依赖项属性吗? 只需在xaml中给你的用户控制一个名字x:Name="myUserControl",并在你的Binding中写{Binding ElementName=myUserControl, Path=MyDependencyProperty}.至少我是怎么做的,除非有人更好地了解这个奇怪的限制。

答案 1 :(得分:0)

试试这个...

的Xaml

<UserControl x:Class="WpfApplication1.DetailDataControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300" Name="root">
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <TextBlock Text="{Binding ItemContext,ElementName=root}" Height="30" Width="100"></TextBlock>
    </Grid>
</UserControl>

背后的代码

 public partial class DetailDataControl : UserControl
    {
        public DetailDataControl()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty ItemContextProperty = DependencyProperty.Register(
            "ItemContext", typeof(string), typeof(DetailDataControl), new PropertyMetadata("default value"));

        public string ItemContext
        {
            get { return (string)GetValue(ItemContextProperty); }
            set { SetValue(ItemContextProperty, value); }
        }
    }

而不是相对来源的绑定我给用户控件命名。不知道相对来源如何通过自我绑定不能按预期工作......

答案 2 :(得分:0)

听起来好像您正在尝试将外部值传递到Path对象的Binding属性中。也就是说,如果ItemContext的值为“Blob”,则您希望绑定到DataContext.Blob(不显示值“Blob”)。

这在代码中很容易实现,因为您可以直接引用该值(将this.ItemContext作为一次性值传递给绑定)。但是,在标记中,您无法执行此操作。相反,您正在尝试值绑定到Path的{​​{1}},但您不能(因为它不是DependencyProperty)。

我建议一个更简单的解决方案是在UserControl上创建一个不同的属性:而不是传入“你要绑定的东西的名称”,为什么不传递东西的价值?

我想你当前的代码是这样的:

Binding

...相反,你应该看起来像这样:

<u:MyControl DataContext="{Binding SomeObject}" ItemContext="MyPropertyName" />

...因此该值在控件外部解析。在控件中,您可以使用@ dowhilefor的解决方案绑定到值。

希望有意义!