我有一种可怕的感觉,我想要做的事情无法完成,但是这里有。也许有更好的方法。
我在一个单独的文件中有一个ResourceDictionary,被拉入UserControl(View):
<UserControl.Resources>
<ResourceDictionary Source="..\Resources.xaml"/>
</UserControl.Resources>
在RD中,我定义了一些按钮样式,其中一个包含一个Condition,如果“IsCurrentFilter”转换器返回True,则将Foreground设置为Red:
<Style x:Key="FilterButton" TargetType="Button" BasedOn="{StaticResource ButtonBase}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Converter={StaticResource IsCurrentFilter}}" Value="True"/>
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Red" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
转换器在相同的RD中定义,进一步向上:
<util:IsCurrentFilterConverter x:Key="IsCurrentFilter" ViewModel="{Binding}"/>
问题是转换器无法访问视图模型(它需要进行比较),而ViewModel
属性只是拒绝绑定任何东西。错误是......
System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:(no path); DataItem=null; target element is 'IsCurrentFilterConverter' (HashCode=50804710); target property is 'ViewModel' (type 'Object')
......哪种方式有道理,据我所知,它不在视觉树中。
那么,如何绑定到此ResourceDictionary中的视图模型?
答案 0 :(得分:2)
你做错了。转换器不应以这种方式绑定到viewmodel。它应该完全取决于它的输入值。设置按钮的方式是viewmodel是按钮的数据上下文,或者在逻辑树的可预测位置可用。然后你的绑定转换器可以将viewmodel“转换”为布尔值。更好的是,添加一个viewmodel属性,提供所需的布尔值并改为绑定它。
答案 1 :(得分:2)
万一有人偶然发现,我选择了不同的技术来解决问题。但是,在资源内部绑定是在这里修复的:
http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF