Maison >développement back-end >C++ >Pourquoi la propriété «SelectedFile» de mon parent ViewModel n'est-elle pas lors de l'utilisation d'une dépendance de Dependency dans un UserControl?
Cet exemple démontre un contrôle de navigateur de fichiers qui affiche le chemin d'accès du fichier sélectionné dans une zone de texte et permet de naviguer.
<code class="language-xml"><UserControl ... x:Class="Test.UserControls.FileBrowserControl"> <Grid ...> <TextBox Text="{Binding SelectedFile}" /> </Grid> </UserControl></code>L'utilisation des contrôles est la suivante:
<code class="language-csharp">public class FileBrowserControl : UserControl { public ICommand BrowseCommand { get; set; } public static DependencyProperty SelectedFileProperty = DependencyProperty.Register("SelectedFile", ...); public string SelectedFile { get => (string)GetValue(SelectedFileProperty); set => SetValue(SelectedFileProperty, value); } public string Filter { get; set; } public FileBrowserControl() { ... this.DataContext = this; // 将 DataContext 设置为 FileBrowserControl 实例。 } private void Browse() { ... SelectedFile = dialog.FileName; // 更新 FileBrowserControl 实例的 SelectedFile 属性。 } }</code>
Question:
<code class="language-xml"><FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" /></code>
Lorsque vous cliquez sur le bouton "Parcourir", la zone de texte dans le contrôle du navigateur de fichier sera correctement mise à jour, mais la propriété sélectionnée du contrôle parent ViewModel ne sera pas définie.
La cause profonde:
Le problème est que le DataConText est défini sur lui-même dans le constructeur de FileBrowserControl à lui-même:
Ce conflit avec l'héritage lié au ViewModel, car il détruit toutes les attributs de liaison de données de liaison de liaison à l'aide de ParelativeSource.Solution:
<code class="language-csharp">this.DataContext = this;</code>
Afin de résoudre ce problème, la liaison dans le xaml de userControl doit être modifiée:
Cela peut garantir que la propriété SelectedFile est liée à l'attribut de fichier sélectionné dans la partie de contrôle parent, qui hérite du DataconText du contrôle de son père. En spécifiant
, la liaison trouvera le niveau parent d'UserControl, afin de trouver l'attributcorrect.
<code class="language-xml"><TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType=UserControl}}" /></code>Grâce à la modification ci-dessus, les attributs
du parent ViewModel seront mis à jour correctement. RelativeSource AncestorType=UserControl
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!