Frage

Wenn WPF Benutzersteuerelemente zu entwickeln, was ist der beste Weg, um eine DependencyProperty eines Kindes Kontrolle als DependencyProperty von dem Usercontrol zu entlarven? Das folgende Beispiel zeigt, wie ich zur Zeit die Text-Eigenschaft eines TextBox innerhalb eines Usercontrol aussetzen würde. Sicherlich gibt es eine bessere / einfachere Art und Weise dies zu erreichen?

<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(); }
    }
}
War es hilfreich?

Lösung

Das ist, wie wir es in unserem Team tun, ohne die Relative Suche, sondern durch die Usercontrol Benennung und Referenzierung Eigenschaften von den Usercontrol Namen.

<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>

Manchmal haben wir uns zwar viele Dinge Usercontrol macht auch gefunden, und haben oft skaliert unsere Nutzungs zurück. Ich würde auch die Tradition der Namensgebung Dinge wie die Textbox entlang der Linien von PART_TextDisplay oder etwas, folgen, so dass in der Zukunft könnte man es noch die Code-Behind-Vorlage aus hält das gleiche.

Andere Tipps

Sie können einstellen, Datacontext dies in Usercontrol-Konstruktor, dann bindet nur durch einzigen Weg.

CS:

DataContext = this;

XAML:

<TextBox Margin="8" Text="{Binding Text} />
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top