Domanda

Quando si sviluppano UserControls WPF, qual è il modo migliore per esporre una DependencyProperty di un controllo figlio come DependencyProperty di UserControl?L'esempio seguente mostra come esporrei attualmente la proprietà Text di un TextBox all'interno di un UserControl.Sicuramente esiste un modo migliore/più semplice per raggiungere questo obiettivo?

<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(); }
    }
}
È stato utile?

Soluzione

Questo è il modo in cui lo stiamo facendo nel nostro team, senza la ricerca RelativeSource, piuttosto nominando UserControl e facendo riferimento alle proprietà con il nome di 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>

A volte però ci siamo trovati a fare troppe cose di UserControl e spesso abbiamo ridotto il nostro utilizzo.Seguirei anche la tradizione di nominare cose come quella casella di testo sulla falsariga di PART_TextDisplay o qualcosa del genere, in modo che in futuro potresti modellarlo mantenendo lo stesso code-behind.

Altri suggerimenti

Puoi impostare DataContext su questo nel costruttore di UserControl, quindi semplicemente associarlo solo tramite percorso.

CS:

DataContext = this;

XAML:

<TextBox Margin="8" Text="{Binding Text} />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top