WPF使用PropertyTools的PropertyGrid时DataContext异常切换如何解决?
问题原因
这是WPF数据模板的标准设计逻辑:所有用于展示控件内部项的DataTemplate,其绑定上下文会被自动替换为当前对应项的数据源对象。你用到的TabHeaderTemplate是PropertyGrid内部为每个标签项定义的模板,因此上下文会被自动设置为PropertyTools库内部的Tab类实例,自然无法直接访问到你自己ViewModel中的属性。
修复方案
你可以通过绑定的RelativeSource参数向上追溯外层父控件的上下文,修改你的HeaderTemplate代码即可:
<UserControl.Resources> <DataTemplate x:Key="HeaderTemplate"> <TextBlock Text="{Binding DataContext.TabName, RelativeSource={RelativeSource AncestorType={x:Type UserControl}}}" /> </DataTemplate> </UserControl.Resources>
如果你担心父级控件类型不确定,也可以给你的UserControl设置一个唯一名称,用ElementName绑定:
- 先给UserControl根节点加名称属性:
x:Name="ViewRoot" - 修改模板内的绑定为:
<TextBlock Text="{Binding DataContext.TabName, ElementName=ViewRoot}" />
两种方案都可以直接读取到你原始ViewModel中的TabName属性,不需要修改第三方控件或者数据源的代码。
内容的提问来源于stack exchange,提问作者Mason Wheeler
相关产品推荐
相关产品推荐

