Установить путь привязки данных внутри UserControl - PullRequest
1 голос
/ 09 февраля 2009

Я не знаю, как установить Path внутри UserControl на основе Parameter:

Пользовательский контроль:

<UserControl x:Class="WpfApplication3.TestControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:diagnostics="clr-namespace:System.Diagnostics;assembly=WindowsBase">
    <Grid>
        <TextBox Text="{Binding Path=MyPath}"/>
    </Grid>
</UserControl>

Код позади:

   public partial class TestControl : UserControl
    {
        public string MyPath
        {
            get { return (string)GetValue(MyPathProperty); }
            set { SetValue(MyPathProperty, value); }
        }
        public static readonly DependencyProperty MyPathProperty =
            DependencyProperty.Register("MyPath", typeof(string), typeof(TestControl), new UIPropertyMetadata(""));
    }

И как я планирую его использовать:

<local:TestControl MyPath="FirstName"></local:TestControl>

DataContext будет получено из родительского объекта и содержит класс User со свойством FirstName внутри.

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

Ответы [ 2 ]

1 голос
/ 01 октября 2009

Когда вы пишете в своем XAML:

<TextBox Text="{Binding Path=MyPath}"/>

это пытается связать вас со свойством MyPath DataContext элемента управления.

Чтобы связать с собственным свойством элемента управления, я думаю, вы должны написать что-то вроде:

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

Имейте один из шпаргалок рядом, на всякий случай;)

1 голос
/ 09 февраля 2009

Мне наконец удалось это сделать, в коде:

private static void MyPathChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    TestControl tc = d as TestControl;
    Binding myBinding = new Binding("MyDataProperty");
    myBinding.Mode = BindingMode.TwoWay;
    myBinding.Path = new PropertyPath(tc.MyPath);
    tc.txtBox.SetBinding(TextBox.TextProperty, myBinding);
}

public static readonly DependencyProperty MyPathProperty =
    DependencyProperty.Register("MyPath",
        typeof(string),
        typeof(TestControl),
        new PropertyMetadata("", MyPathChanged));

пользовательский элемент управления теперь имеет текстовое поле без привязки:

 <TextBox x:Name="txtBox"></TextBox> 

и все.

...