Expose DependencyProperty - PullRequest
       15

Expose DependencyProperty

18 голосов
/ 17 сентября 2008

При разработке WPF UserControls, как лучше всего представить DependencyProperty дочернего элемента управления как DependencyProperty UserControl? В следующем примере показано, как в данный момент я могу представить свойство Text TextBox внутри UserControl. Конечно, есть лучший / более простой способ сделать это?

<UserControl x:Class="WpfApplication3.UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Background="LightCyan">
        <TextBox Margin="8" Text="{Binding Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
    </StackPanel>
</UserControl>


using System;
using System.Windows;
using System.Windows.Controls;

namespace WpfApplication3
{
    public partial class UserControl1 : UserControl
    {
        public static DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new PropertyMetadata(null));
        public string Text
        {
            get { return GetValue(TextProperty) as string; }
            set { SetValue(TextProperty, value); }
        }

        public UserControl1() { InitializeComponent(); }
    }
}

Ответы [ 2 ]

17 голосов
/ 17 сентября 2008

Вот как мы делаем это в нашей команде, без поиска RelativeSource, а просто присваивая имя UserControl и ссылаясь на свойства по имени UserControl.

<UserControl x:Class="WpfApplication3.UserControl1" x:Name="UserControl1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <StackPanel Background="LightCyan">
        <TextBox Margin="8" Text="{Binding Path=Text, ElementName=UserControl1}" />
    </StackPanel>
</UserControl>

Иногда мы сталкиваемся с тем, что делаем слишком много всего, что делает UserControl, и часто сокращаем наше использование. Я также следовал бы традиции называть такие вещи, как это текстовое поле, по типу PART_TextDisplay или что-то в этом роде, чтобы в будущем вы могли создавать его в шаблонах, сохраняя при этом код позади.

1 голос
/ 03 января 2010

Вы можете установить DataContext на это в конструкторе UserControl, а затем просто связать только путем.

CS:

DataContext = this;

XAML:

<TextBox Margin="8" Text="{Binding Text} />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...