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中的视图模型呢?

XAML ResourceDictionary内部的绑定

你做错了。转换器不应该以这种方式绑定到视图模型。它应该完全取决于它的输入值。设置按钮时,视图模型是按钮的数据上下文,或者在逻辑树上的可预测位置可用。然后,绑定的转换器可以将视图模型"转换"为布尔值。更好的是,添加一个提供所需布尔值的viewmodel属性,并绑定到它。

为了防止有人偶然发现这个问题,我选择了一种不同的技术来解决这个问题。然而,资源内部的绑定在这里已经得到了修复:

http://www.codeproject.com/Articles/27432/Artificial-Inheritance-Contexts-in-WPF