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

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

DDD
發布: 2025-02-01 17:16:09
原創
532 人瀏覽過

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

DependencyProperty 綁定問題及解決方案

此示例演示了一個文件瀏覽器控件,該控件在一個文本框中顯示所選文件的路徑,並允許瀏覽文件。

<UserControl ... x:Class="Test.UserControls.FileBrowserControl">
    <Grid ...>
        <TextBox Text="{Binding SelectedFile}" />
    </Grid>
</UserControl>
登入後複製
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 属性。
    }
}
登入後複製

控件的使用方式如下:

<FileBrowserControl Filter="XSLT File (*.xsl)|*.xsl|All Files (*.*)|*.*" SelectedFile="{Binding SelectedFile}" />
登入後複製

問題:

點擊“瀏覽”按鈕時,文件瀏覽器控件中的文本框會正確更新,但父控件 ViewModel 的 SelectedFile 屬性不會被設置。

根本原因:

問題在於,FileBrowserControl 的構造函數中將 DataContext 設置為自身:

this.DataContext = this;
登入後複製

這與 ViewModel 綁定的繼承相衝突,因為它破壞了使用 RelativeSource 綁定的任何數據綁定屬性。

解決方案:

為了解決這個問題,應該修改 UserControl 的 XAML 中的綁定:

<TextBox Text="{Binding SelectedFile, RelativeSource={RelativeSource AncestorType=UserControl}}" />
登入後複製

這樣可以確保 SelectedFile 屬性綁定到父控件 ViewModel 中的 SelectedFile 屬性,該屬性繼承自其父控件的 DataContext。 通過指定 RelativeSource AncestorType=UserControl,綁定會向上查找 UserControl 的父級,從而找到正確的 SelectedFile 屬性。

通過以上修改,父級ViewModel的SelectedFile屬性將會正確更新。

以上是在使用UserControl中使用DepertencyProperty時,為什麼我的父viewModel的' selectionfile”屬性更新?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板