Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XAML ResourceDictionary中的绑定_C#_.net_Wpf_Caliburn.micro_Multidatatrigger - Fatal编程技术网

C# XAML ResourceDictionary中的绑定

C# XAML ResourceDictionary中的绑定,c#,.net,wpf,caliburn.micro,multidatatrigger,C#,.net,Wpf,Caliburn.micro,Multidatatrigger,我有一种可怕的感觉,我想做的事是做不到的,但事情是这样的。也许有更好的办法 我在一个单独的文件中有一个ResourceDictionary,它被拉入一个UserControl(视图)中: …这有点道理,据我所知,它不在视觉树中 那么,如何绑定到此ResourceDictionary中的视图模型呢?您做错了。转换器不应以这种方式绑定到viewmodel。它应完全取决于其输入值。设置按钮时,请确保viewmodel是按钮的数据上下文,或者在逻辑树上的可预测位置可用。然后绑定的转换器可以将viewmo

我有一种可怕的感觉,我想做的事是做不到的,但事情是这样的。也许有更好的办法

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

…这有点道理,据我所知,它不在视觉树中


那么,如何绑定到此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')