2008-09-16 6 views
18

Lors du développement de UserControls WPF, 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'exposer actuellement la propriété Text d'un TextBox dans un UserControl. Sûrement il y a une manière meilleure/plus simple d'accomplir ceci?Expose DependencyProperty

<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(); } 
    } 
} 

Répondre

17

C'est ainsi que nous le faisons dans notre équipe, sans la recherche RelativeSource plutôt en nommant les propriétés UserControl et référencement par le nom du 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 trouvé nous faire trop de choses UserControl pour bien, et ont souvent revu à la baisse de notre consommation. Je suivrais également la tradition de nommer des choses comme cette zone de texte sur le modèle de PART_TextDisplay ou quelque chose, de sorte que dans le futur vous puissiez le modéliser tout en gardant le code derrière.

+0

cette façon fonctionne le mieux dans Silverlight 4, où il n'y a pas 'FindAncestor' –

+0

Cela a fonctionné pour moi, mais il ne semble pas que vous pouvez utilise les mêmes 'x: Class' et' x: Name'. Je devais avoir une classe comme 'WpfApplication1.SliderLabel' et je lui ai donné un nom comme' SliderLabelControl'. Sinon, il s'est plaint que le nom existait déjà. –

1

Vous pouvez définir DataContext dans le constructeur de UserControl, puis lier uniquement par le chemin.

CS:

DataContext = this; 

XAML:

<TextBox Margin="8" Text="{Binding Text} /> 
+1

cela ne fonctionne que sur une échelle limitée. si vous avez vraiment besoin d'un datacontexte, vous êtes foutu –

Questions connexes