XAML ResourceDictionary内部的绑定
本文关键字:绑定 内部 ResourceDictionary XAML | 更新日期: 2023-09-27 17:59:16
我有一种可怕的感觉,我想做的事情无法完成,但现在开始了。也许还有更好的方法。
我在一个单独的文件中有一个ResourceDictionary,它被拉入UserControl(视图):
<UserControl.Resources>
<ResourceDictionary Source="..'Resources.xaml"/>
</UserControl.Resources>
在RD中,我定义了一些按钮样式,其中一个包括Condition,如果"IsCurrentFilter"转换器返回True,则将前景设置为红色:
<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中的视图模型呢?
你做错了。转换器不应该以这种方式绑定到视图模型。它应该完全取决于它的输入值。设置按钮时,视图模型是按钮的数据上下文,或者在逻辑树上的可预测位置可用。然后,绑定的转换器可以将视图模型"转换"为布尔值。更好的是,添加一个提供所需布尔值的viewmodel属性,并绑定到它。
为了防止有人偶然发现这个问题,我选择了一种不同的技术来解决这个问题。然而,资源内部的绑定在这里已经得到了修复:
http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF