C# XAML ResourceDictionary中的绑定
我有一种可怕的感觉,我想做的事是做不到的,但事情是这样的。也许有更好的办法 我在一个单独的文件中有一个ResourceDictionary,它被拉入一个UserControl(视图)中: …这有点道理,据我所知,它不在视觉树中C# XAML ResourceDictionary中的绑定,c#,.net,wpf,caliburn.micro,multidatatrigger,C#,.net,Wpf,Caliburn.micro,Multidatatrigger,我有一种可怕的感觉,我想做的事是做不到的,但事情是这样的。也许有更好的办法 我在一个单独的文件中有一个ResourceDictionary,它被拉入一个UserControl(视图)中: …这有点道理,据我所知,它不在视觉树中 那么,如何绑定到此ResourceDictionary中的视图模型呢?您做错了。转换器不应以这种方式绑定到viewmodel。它应完全取决于其输入值。设置按钮时,请确保viewmodel是按钮的数据上下文,或者在逻辑树上的可预测位置可用。然后绑定的转换器可以将viewmo
那么,如何绑定到此ResourceDictionary中的视图模型呢?您做错了。转换器不应以这种方式绑定到viewmodel。它应完全取决于其输入值。设置按钮时,请确保viewmodel是按钮的数据上下文,或者在逻辑树上的可预测位置可用。然后绑定的转换器可以将viewmodel“转换”为布尔值。更好的是,添加一个viewmodel属性,提供所需的布尔值,并绑定到它。您做得不对。转换器不应以这种方式绑定到viewmodel。它应完全取决于其输入值。设置按钮时,请确保viewmodel是按钮的数据上下文,或者在逻辑树上的可预测位置可用。然后绑定的转换器可以将viewmodel“转换”为布尔值。更好的是,添加一个viewmodel属性,提供所需的布尔值并绑定到它。为了防止有人偶然发现这个问题,我选择了一种不同的技术来解决这个问题。但是,资源内部的绑定在这里已经修复:
为了防止有人偶然发现这个问题,我选择了另一种技术来解决这个问题。但是,资源内部的绑定在这里已经修复:
我同意,它应该完全取决于它的输入值。我一开始只是直接从视图模型比较当前过滤器,但显然ConverterParameter不是DependencyProperty。无论如何,不幸的是,我无法更改/控制按钮的DataContext,因为我需要它作为样式设置的过滤器。接下来,这个建议实际上正好解决了这个问题。现在我可以访问ViewModel,但不知道转换器中引用的是哪个过滤器。这很简单。您有两个选项:1)为过滤器提供对viewmodel的引用—它通常对很多东西都很有用;2) 制作一个多值转换器并传入过滤器和viewmodel(使用例如
{RelativeSource FindAncestor}
查找)。我会将此标记为答案,因为它比实际答案更好。我同意,它应该完全取决于其输入值。我一开始只是直接从视图模型比较当前过滤器,但显然ConverterParameter不是DependencyProperty。无论如何,不幸的是,我无法更改/控制按钮的DataContext,因为我需要它作为样式设置的过滤器。接下来,这个建议实际上正好解决了这个问题。现在我可以访问ViewModel,但不知道转换器中引用的是哪个过滤器。这很简单。您有两个选项:1)为过滤器提供对viewmodel的引用—它通常对很多东西都很有用;2) 制作一个多值转换器并传入过滤器和viewmodel(使用例如{RelativeSource FindAncestor}
查找)。我将此标记为答案,因为它比实际答案更好。
<UserControl.Resources>
<ResourceDictionary Source="..\Resources.xaml"/>
</UserControl.Resources>
<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>
<util:IsCurrentFilterConverter x:Key="IsCurrentFilter" ViewModel="{Binding}"/>
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')