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中文网其他相关文章!