首页 >后端开发 >C++ >在使用UserControl中使用DepertencyProperty时,为什么我的父viewModel的' selectionfile”属性更新?

在使用UserControl中使用DepertencyProperty时,为什么我的父viewModel的' selectionfile”属性更新?

DDD
DDD原创
2025-02-01 17:16:09480浏览

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

DependencyProperty 绑定问题及解决方案

此示例演示了一个文件浏览器控件,该控件在一个文本框中显示所选文件的路径,并允许浏览文件。

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

控件的使用方式如下:

<code class="language-xml"><FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" /></code>

问题:

点击“浏览”按钮时,文件浏览器控件中的文本框会正确更新,但父控件 ViewModel 的 SelectedFile 属性不会被设置。

根本原因:

问题在于,FileBrowserControl 的构造函数中将 DataContext 设置为自身:

<code class="language-csharp">this.DataContext = this;</code>

这与 ViewModel 绑定的继承相冲突,因为它破坏了使用 RelativeSource 绑定的任何数据绑定属性。

解决方案:

为了解决这个问题,应该修改 UserControl 的 XAML 中的绑定:

<code class="language-xml"><TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType=UserControl}}" /></code>

这样可以确保 SelectedFile 属性绑定到父控件 ViewModel 中的 SelectedFile 属性,该属性继承自其父控件的 DataContext。 通过指定 RelativeSource AncestorType=UserControl,绑定会向上查找 UserControl 的父级,从而找到正确的 SelectedFile 属性。

通过以上修改,父级ViewModel的SelectedFile属性将会正确更新。

以上是在使用UserControl中使用DepertencyProperty时,为什么我的父viewModel的' selectionfile”属性更新?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn