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中文網其他相關文章!