Question

Lors du développement de WPF UserControls, quel est le meilleur moyen d'exposer un DependencyProperty d'un contrôle enfant en tant que DependencyProperty du UserControl? L'exemple suivant montre comment j'exposerais actuellement la propriété Text d'un TextBox à l'intérieur d'un UserControl. Il existe sûrement un moyen meilleur / plus simple pour y parvenir?

<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(); }
    }
}
Était-ce utile?

La solution

C’est ce que nous faisons dans notre équipe, sans recherche RelativeSource, mais en nommant UserControl et en référençant les propriétés par le nom de 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>

Parfois, nous avons créé trop de choses dans UserControl et avons souvent réduit notre utilisation. Je suivrais également la tradition consistant à nommer des éléments tels que cette zone de texte dans le sens de PART_TextDisplay, ou quelque chose du genre, afin qu'à l'avenir, vous puissiez le modéliser tout en conservant le même code-behind.

Autres conseils

Vous pouvez définir DataContext sur ceci dans le constructeur de UserControl, puis liez simplement par chemin uniquement.

CS:

DataContext = this;

XAML:

<TextBox Margin="8" Text="{Binding Text} />
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top