Pergunta

Ao desenvolver UserControls WPF, qual é a melhor maneira de expor um DependencyProperty de um controle filho como um DependencyProperty do UserControl?O exemplo a seguir mostra como eu exporia atualmente a propriedade Text de um TextBox dentro de um UserControl.Certamente existe uma maneira melhor/mais simples de fazer isso?

<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(); }
    }
}
Foi útil?

Solução

É assim que estamos fazendo em nossa equipe, sem a pesquisa RelativeSource, em vez de nomear o UserControl e referenciar as propriedades pelo nome do 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>

Às vezes, nos encontramos fazendo muitas coisas no UserControl e muitas vezes reduzimos nosso uso.Eu também seguiria a tradição de nomear coisas como aquela caixa de texto nos moldes de PART_TextDisplay ou algo assim, para que no futuro você pudesse modelá-la e ainda assim manter o código por trás do mesmo.

Outras dicas

Você pode definir DataContext para isso no construtor do UserControl e, em seguida, vincular apenas por caminho.

CS:

DataContext = this;

XAML:

<TextBox Margin="8" Text="{Binding Text} />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top