【问题标题】:Binding inside a XAML ResourceDictionary在 XAML ResourceDictionary 内绑定
【发布时间】:2013-01-31 05:26:32
【问题描述】:

我有一种可怕的感觉,我正在尝试做的事情无法完成,但就是这样。也许有更好的方法。

我在一个单独的文件中有一个 ResourceDictionary,被拉入一个 UserControl(视图):

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

【问题讨论】:

    标签: c# .net wpf caliburn.micro multidatatrigger


    【解决方案1】:

    以防万一有人偶然发现这一点,我选择了一种不同的技术来解决问题。但是,资源内部的绑定在此处已得到修复:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我同意,它应该完全取决于它的输入值。我一开始只是直接比较来自视图模型的当前过滤器,但显然 ConverterParameter 不是 DependencyProperty。无论如何,不​​幸的是,我无法更改/控制 Button 的 DataContext,因为我需要它作为样式过滤器。
      • 跟进,这个建议实际上只是颠倒了问题。现在我可以访问 ViewModel 但不知道转换器中引用了哪个过滤器。
      • 这很简单。你有两个选择:1)为过滤器提供对视图模型的引用——它通常对很多东西有用; 2)制作一个多值转换器并传入过滤器和视图模型(使用例如{RelativeSource FindAncestor}找到它)。
      • 我会将其标记为答案,因为它是比真正答案更好的建议。
      猜你喜欢
      • 1970-01-01
      • 2019-01-08
      • 2020-06-15
      • 2012-04-11
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多