Sto tentando di creare un proxy di proprietà di dipendenza semplice. Ho creato un controllo personalizzato, è un raccoglitore di file, che è costituito da una casella di testo (nome: "TextBox_FilePath"
) e un pulsante che mostra la finestra di dialogo del file aperto.Creare un proxy per una proprietà di dipendenza
Mentre eseguo un controllo riutilizzabile mi piacerebbe avere una proprietà "SelectedFilePath"
. Poiché la proprietà Text
sembra essere perfetta affinché il mio controllo sia la proprietà "SelectedFilePath"
, desidero semplicemente eseguire il proxy di queste proprietà di dipendenza.
Il primo approccio che ho fatto era:
public static readonly DependencyProperty SelectedFilePathProperty = TextBox.TextProperty;
public string SelectedFilePath
{
get { return (string) this.TextBox_FilePath.GetValue(SelectedFilePathProperty); }
set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); }
}
che ha funzionato, ma gettato un'eccezione quando si cerca di legarsi a quella proprietà. Poi sono uscito con:
public static readonly DependencyProperty SelectedFilePathProperty =
DependencyProperty.Register("SelectedFilePath", typeof (string), typeof (FilePicker), new PropertyMetadata(default(string)));
public string SelectedFilePath
{
get { return (string) this.TextBox_FilePath.GetValue(SelectedFilePathProperty); }
set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); }
}
che funziona, ma non ho idea del perché ?! Dove ho specificato che volevo la proprietà text
della casella di testo?
Che cosa mi manca semplicemente proxy di proprietà di dipendenza?
EDIT: La soluzione con AddOwner
non funziona troppo, viene generata Excetion dire "legame può essere applicato solo su una proprietà di dipendenza". Codice:
public static readonly DependencyProperty SelectedFilePathProperty =
TextBox.TextProperty.AddOwner(typeof(FilePicker));
public string SelectedFilePath
{
get { return (string)this.TextBox_FilePath.GetValue(SelectedFilePathProperty); }
set { this.TextBox_FilePath.SetValue(SelectedFilePathProperty, value); }
}
Cosa non capisco?
EDIT2: per tutti gli altri che hanno problemi di comprensione la risposta, ho fatto a little graphic
Si prega di vedere la mia modifica :) – GameScripting
* Come ho detto *, è registrato con il nome di "testo", si può quindi legarsi solo a una proprietà chiamata 'Testo', la proprietà' SelectedFilePath' che hai creato è solo un wrapper per comodità nel tuo codice imperativo, i binding non la usano mai. Registra la tua proprietà se vuoi un nome diverso. –
Puoi essere così gentile e fornire un esempio o dare qualche riferimento su come farlo? – GameScripting