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>
<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>
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!