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?

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?

DDD
Libérer: 2025-02-01 17:16:09
original
515 Les gens l'ont consulté

Why Doesn't My Parent ViewModel's `SelectedFile` Property Update When Using a DependencyProperty in a UserControl?

Problème et solution de liaison de la dépendance de la dépendance

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>
Copier après la connexion
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>
Copier après la connexion

Question:
<code class="language-xml"><FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" /></code>
Copier après la connexion

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>
Copier après la connexion

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'attribut

correct.

<code class="language-xml"><TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType=UserControl}}" /></code>
Copier après la connexion
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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal