我使用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 });
有人有想法吗?
由于
答案 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的解决方案绑定到值。
希望有意义!