j'ai un UserControl
avec une propriété Template
que j'ai mis en place comme DependencyProperty
:WPF, ne peut lier une propriété parce qu'il dit que ce n'est pas un DependencyProperty, mais j'enregistré il
public partial class TemplateDetail : UserControl
{
public static readonly DependencyProperty _templateProperty =
DependencyProperty.Register(
"Template",
typeof(Template),
typeof(TemplateDetail)
);
public TemplateDetail()
{
InitializeComponent();
Template = new Template();
DataContext = Template;
}
public Template Template
{
get
{
return (Template)GetValue(_templateProperty);
}
set { SetValue(_templateProperty, value); }
}
}
Je suis en train d'utiliser cette UserControl
dans le XAML pour un Window
, SaveTemplateDialog, et je suis en train de définir sa propriété Template
à la propriété Template
dans ma classe SaveTemplateDialog
:
<local:TemplateDetail HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
MinWidth="100" Template="{Binding}"
Width="{Binding ElementName=Scroller, Path=ViewportWidth}"/>
Le DataContext
dans SaveTemplateDialog
est défini sur sa propriété Template
, qui est également une propriété de dépendance. Cependant, pour le XAML ci-dessus, Template="{Binding}"
est souligné en bleu dans Visual Studio et il dit:
A « Reliure » ne peut pas être mis sur la propriété « modèle » de type « TemplateDetail ». Une 'liaison' ne peut être définie que sur un DependencyProperty d'un DependencyObject.
Effectivement, quand je charge mon application, le contenu des Template
que TemplateDetail
tente à afficher est vide, quand je sais qu'il ya des valeurs qu'il contient. Pourquoi donne-t-il ce message si j'ai enregistré TemplateDetail.Template
en tant que propriété de dépendance?
Modifier: maintenant je suis assez confus. Dans ma fenêtre SaveTemplateDialog
, je fais ce qui suit pour transmettre le modèle à la TemplateDetail
UserControl
:
<local:TemplateDetail HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
TemplateData="{Binding Path=NewTemplate, Mode=OneWay}"
Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="3"/>
Je sais Path=NewTemplate
est d'obtenir les bonnes données, parce que j'ai aussi ce XAML dans SaveTemplateDialog
, qui montre la valeur I peut s'y attendre dans la propriété MyType
de NewTemplate
:
<TextBlock Text="{Binding Path=NewTemplate.MyType}" />
ce TextBlock
montre ce que je pense. Cependant, apparemment les bonnes données n'obtiennent pas à TemplateDetail
ou je ne suis pas lié correctement là, parce que je ne peux pas obtenir la même propriété MyType
(ou les autres propriétés Template
) pour apparaître dans TemplateDetail
. En TemplateDetail
:
<TextBlock Text="{Binding Path=TemplateData.MyType}" Grid.Row="2" Grid.Column="2"
HorizontalAlignment="Stretch" Width="200"/>
Et voici la classe TemplateDetail
comme il est maintenant:
public partial class TemplateDetail : MainWindowUserControl
{
public static readonly DependencyProperty TemplateDataProperty =
DependencyProperty.Register(
"TemplateData",
typeof(Template),
typeof(TemplateDetail),
new PropertyMetadata(
new Template("Default Template", null)
)
);
public TemplateDetail()
{
InitializeComponent();
DataContext = this;
}
public Template TemplateData
{
get
{
return (Template)GetValue(TemplateDataProperty);
}
set { SetValue(TemplateDataProperty, value); }
}
}
Je ne suis pas sûr de savoir si Template est un mot réservé ici. Avez-vous essayé une propriété de dépendance nommée différemment? – Robaticus
@Robaticus: J'ai renommé la propriété 'TemplateDetail.Template' en' TemplateData'; qui s'est débarrassé de la ligne bleue et d'avertissement sur la liaison. Je ne vois toujours pas les données du modèle lorsque j'utilise mon application, mais c'est probablement un problème différent. Merci! Vous devriez ajouter votre commentaire en guise de réponse. –