首頁 >後端開發 >C++ >在使用UserControl中使用DepertencyProperty時,為什麼我的父viewModel的' selectionfile”屬性更新?

在使用UserControl中使用DepertencyProperty時,為什麼我的父viewModel的' selectionfile”屬性更新?

DDD
DDD原創
2025-02-01 17:16:09529瀏覽

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