Привязка к имени свойства через строку DependencyProperty - PullRequest
0 голосов
/ 12 июля 2011

Я создал UserControl с ItemContext DependencyProperty. Это свойство содержит имя свойства моего DataContext объекта, с которым должно связываться текстовое свойство элемента управления.

Я не могу понять, как это сделать в XAML. Я попробовал несколько шагов, я совсем рядом, но не смог его найти.

Примерно так:

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

Но здесь содержимое "ItemContext" напрямую связано с текстовым свойством, которое мне не нужно. Содержимое «ItemContext», скажем, «Property1» - это имя свойства в моем DataContext, к которому я хочу привязать.

В коде это работает так:

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

У кого-нибудь есть идея?

Спасибо

Ответы [ 3 ]

0 голосов
/ 12 июля 2011

Попробуйте это ...

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); }
        }
    }

вместо привязки к относительному источнику у меня есть имя для пользовательского элемента управления. Я не знаю, как относительный источник не будет работать, как ожидается, с самообязанием ...

0 голосов
/ 12 июля 2011

Звучит так, как будто вы пытаетесь передать внешнее значение в свойство Path объекта Binding. То есть, если значение ItemContext равно «Blob», необходимо выполнить привязку к DataContext.Blob (не отображать значение «Blob»).

Это легко сделать в коде, потому что вы можете напрямую ссылаться на значение (вы передаете this.ItemContext привязке как одноразовое значение). В разметке, однако, вы не можете сделать это. Вместо этого вы пытаетесь связать значение с Path из Binding, но вы не можете (потому что это не DependencyProperty).

Я бы предположил, что гораздо более простым решением было бы создать другое свойство в вашем UserControl: вместо того, чтобы передавать «имя объекта, с которым вы хотите связать», почему бы просто не передать значение объекта

Я представляю, что ваш текущий код выглядит так:

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

... и вместо этого вы должны сделать так, чтобы это выглядело так:

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

... так что значение разрешено извне элемента управления. Внутри элемента управления вы можете использовать решение @ dowhilefor для привязки к значению.

Надеюсь, это имеет смысл!

0 голосов
/ 12 июля 2011

Если я правильно понимаю.Вы хотите использовать свойство зависимости из своего кода usercontrol позади, в своем пользовательском элементе управления xaml?Просто дайте в xaml свой пользовательский элемент управления имя x:Name="myUserControl" и в своем Binding напишите {Binding ElementName=myUserControl, Path=MyDependencyProperty}. По крайней мере, как я это делаю, если кто-то не имеет лучшего представления об этом странном ограничении.

...