WPF样式中使用d:DataContext报错:该属性在Blend命名空间不存在
解决WPF Style中设置设计时DataContext报错的问题
你遇到的这个错误核心原因很明确:Style并不是FrameworkElement的派生类,它本身没有DataContext属性——哪怕是Blend设计时专用的d:DataContext也不能直接挂在Style标签上。Blend的d命名空间(http://schemas.microsoft.com/expression/blend/2008)里确实不存在DataContext这个属性,这个属性属于WPF的核心控件体系,只能用在可视化元素上。
下面给你几种可行的解决方案,帮你在Style中获得完整的IntelliSense支持:
方案1:在ControlTemplate的根元素上设置设计时DataContext
如果你的Style包含自定义控件模板,直接把d:DataContext加到模板的根可视化元素上,模板内部的绑定就能自动识别目标类型:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:alarm="clr-namespace:Foo.Alarm;assembly=HtCore" mc:Ignorable="d"> <Style TargetType="TreeViewItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="TreeViewItem"> <!-- 这里的Border是可视化元素,可以设置d:DataContext --> <Border d:DataContext="{d:DesignInstance alarm:HtAlarmBase}"> <!-- 绑定会自动获得HtAlarmBase的IntelliSense提示 --> <TextBlock Text="{Binding AlarmName}" /> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style> </ResourceDictionary>
方案2:直接在Binding上指定设计时实例
如果只是给普通属性设置绑定,不用写模板,可以直接在Binding表达式里通过d:DesignInstance指定目标类型:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:alarm="clr-namespace:Foo.Alarm;assembly=HtCore" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" mc:Ignorable="d"> <Style TargetType="TreeViewItem"> <!-- 直接在Binding上关联设计时类型,触发IntelliSense --> <Setter Property="Header" Value="{Binding AlarmName, d:DesignInstance={x:Type alarm:HtAlarmBase}}" /> </Style> </ResourceDictionary>
方案3:给整个ResourceDictionary设置设计时DataContext
如果你的字典里有多个Style都需要用到同一个设计时类型,可以直接在ResourceDictionary的根元素上设置d:DataContext,这样所有子元素的绑定都会继承这个上下文:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:alarm="clr-namespace:Foo.Alarm;assembly=HtCore" mc:Ignorable="d" <!-- 全局设置设计时上下文,整个字典内的绑定都能获得IntelliSense --> d:DataContext="{d:DesignInstance alarm:HtAlarmBase}"> <Style TargetType="TreeViewItem"> <Setter Property="Header" Value="{Binding AlarmName}" /> <Setter Property="Tag" Value="{Binding AlarmId}" /> </Style> </ResourceDictionary>
这些方法都能解决你的报错问题,同时让你在编写绑定的时候获得完整的IntelliSense提示,选哪种取决于你的具体场景。
内容的提问来源于stack exchange,提问作者Dominic Boexler
相关产品推荐
相关产品推荐

