2009-06-18 13 views
6

Sto cercando di creare un UserControl riutilizzabile in WPF con un'etichetta e un controllo TextBox. Voglio aggiungere proprietà al mio UserControl per rendere più chiari i campi di testo di entrambi i controlli figlio fino al genitore per un facile collegamento. Ho letto che ho bisogno di un po 'di messa a fuoco aggiungendo i proprietari a DependencyProperties. Ecco il mio codice ora. Sembra vicino ma non del tutto corretto. Qualche idea?Controlli compositi WPF

Ecco il codice XAML:

<UserControl x:Class="MAAD.AircraftExit.Visual.LabelTextBox" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Height="20" Width="300"> 
    <DockPanel> 
     <TextBlock Text="{Binding Path=Label, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" DockPanel.Dock="Left" TextAlignment="Right" Width="122" /> 
     <TextBlock Text=": " DockPanel.Dock="Left"/> 
     <TextBox Text="{Binding Path=Text, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" /> 
    </DockPanel> 
</UserControl> 

E il codice dietro:

public partial class LabelTextBox : UserControl 
{ 
    public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("Label", typeof(string), typeof(LabelTextBox)); 
    public string Label 
    { 
     get { return (string)GetValue(LabelProperty); } 
     set { SetValue(LabelProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(LabelTextBox)); 
    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set { SetValue(LabelTextBox.TextProperty, value); } 
    } 

    public LabelTextBox() 
    { 
     InitializeComponent(); 

     ClearValue(HeightProperty); 
     ClearValue(WidthProperty); 
    } 
} 

Edit: Ecco il codice di lavoro finale. Sono passato al binding delle fonti relative.

+1

Ho provato la stessa cosa in un primo momento, assumendo che questo fosse il concetto di proprietario. Sfortunatamente mi sono imbattuto negli stessi problemi e ho finito col ricorrere all'utilizzo di binding. Inoltre, le mie proprietà di non dipendenza hanno una soluzione personalizzata diversa per propagare le notifiche di modifica delle proprietà. – jpierson

risposta

6

Binding è davvero la strada da percorrere:

XAML:

<UserControl x:Class="testapp.LabelTextBox " 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Height="300" Width="300" x:Name="This"> 
<DockPanel> 
    <TextBlock DockPanel.Dock="Left" TextAlignment="Right" Width="70" Name="label" Text="{Binding Label, ElementName=This}" /> 
    <TextBlock Text=": " DockPanel.Dock="Left" /> 
    <TextBox Name="textBox" Text="{Binding Text, ElementName=This}" /> 
</DockPanel> 

Codice Dietro:

public partial class LabelTextBox : UserControl 
{ 
    public LabelTextBox() 
    { 
     InitializeComponent(); 
     Label = "Label"; 
     Text = "Text"; 
    } 
    public static readonly DependencyProperty LabelProperty = DependencyProperty.Register("Label", typeof(string), typeof(LabelTextBox), new FrameworkPropertyMetadata(LabelPropertyChangedCallback)); 
    private static void LabelPropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args) 
    { 
    } 
    public string Label 
    { 
     get { return (string) GetValue(LabelProperty); } 
     set { SetValue(LabelProperty, value); } 
    } 

    public static readonly DependencyProperty TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(LabelTextBox), new FrameworkPropertyMetadata(TextPropertyChangedCallback)); 
    private static void TextPropertyChangedCallback(DependencyObject controlInstance, DependencyPropertyChangedEventArgs args) 
    { 
    } 
    public string Text 
    { 
     get { return (string) GetValue(TextProperty); } 
     set { SetValue(LabelTextBox.TextProperty, value); } 
    } 
} 
+0

Grazie per il codice, ottengo questo risultato quando provo ad usarlo: System.Windows.Data Errore: 4: Impossibile trovare l'origine per l'associazione con il riferimento 'ElementName = This'. BindingExpression: Path = Etichetta; DataItem = null; l'elemento target è 'TextBlock' (Name = ''); la proprietà target è 'Testo' (digita 'String') –

+0

Scusa, l'ho capito. Hai definito questo come il nome del controllo. Grazie!! –

1

Non ho esaminato esattamente il motivo per cui la tua implementazione non funziona, ma non capisco davvero perché lo stai facendo in quel modo. Perché non solo definire le proprietà di dipendenza necessarie su UserControl e quindi associarle?

public static readonly DependencyProperty LabelTextProperty = ...; 

E poi nel tuo XAML:

<Label Content="{Binding LabelText}"/> 
Problemi correlati