Ce que je vois ici est qui est Main
, que vous avez ajouté une propriété RecordProp
au nom de la classe de la fenêtre, et que vous êtes essaie maintenant de lier à la propriété IsChecked
de l'élément nommé RecordProp
. Je pense que vous êtes un peu confus sur la façon dont les noms fonctionnent. L'ajout de l'attribut x:Name
à un élément XAML crée un champ dans la classe de fenêtre portant ce nom. Cela vous permet de référencer des éléments nommés dans votre code, et cela vous a probablement amené à penser que la liaison peut faire la même chose.
Mais ce n'est pas ainsi que la liaison trouve des éléments nommés. L'attribut x:Name
également prend l'objet que l'élément XAML crée et enregistre sous ce nom dans la portée de la fenêtre. (Voir MSDN's article on XAML namescopes.) C'est ce que la liaison regarde pour résoudre les noms d'éléments. Étant donné que vous n'ajoutez jamais l'objet à l'objet Namescope, la propriété ElementName
sur une liaison ne le trouvera pas.
Il y a plusieurs choses que vous pourriez faire. Si vous voulez vraiment lier à une propriété de la fenêtre, vous pouvez donner à la fenêtre un nom et se lier à la propriété à l'aide d'un chemin de propriété:
<Window x:Name="MainWindow" x:Class="Main">
...
<customcontrol Name="View" IsChecked="
{Binding ElementName=MainWindow,
Path=RecordProp.IsViewChecked}" />
Encore plus simple est de simplement définir le contexte de données dans le constructeur:
DataContext = this;
une fois que vous faites cela, vous pouvez simplement lier à la propriété RecordProp
(et toute autre propriété de la fenêtre) comme ceci:
<customControl Name="View" IsChecked={Binding RecordProp.IsChecked}/>
bien sûr, cela ne fonctionnera pas si yo Vous avez besoin que le contexte de données de la fenêtre soit défini sur autre chose.
Une autre possibilité est de mettre en œuvre la propriété comme ceci:
public Record RecordProp
{
get { return (Record)Resources["RecordProp"]; }
set { Resources["RecordProp"] = value; }
}
Vous pouvez lier à cela en utilisant (par exemple) Binding {DynamicResource RecordProp}, Path=IsChecked"
.Comme c'est une ressource dynamique, si quelque chose d'extérieur à la fenêtre définit la propriété RecordProp
de la fenêtre, ses liaisons seront rafraîchies - ce qui ne se produira pas si vous ne faites que RecordProp
une propriété (sauf si vous implémentez une notification de modification).
La propriété publique n'a eu aucun effet. – jaws
@ user258651 Je pense que vous devez également mettre à jour le contexte de liaison pour que la fenêtre principale retourne par défaut à la classe Main. Été un certain temps depuis que j'ai regardé cela cependant. – JaredPar