C# 从外包的ResourceDictionary访问MainWindow.xaml.cs属性

C# 从外包的ResourceDictionary访问MainWindow.xaml.cs属性,c#,wpf,architecture,user-controls,resourcedictionary,C#,Wpf,Architecture,User Controls,Resourcedictionary,我最近正在开发一个新的用户控件,我必须使其可定制,直到我发现这不是一个问题,我必须将数据模板放入外部资源字典中,以便使控件更可定制 那我有什么? 我有一个非常可定制的UserControl,它可以调用构造函数 使用所谓的“templatePath”,将ResourceDictionary从中加载到UserControl.Resources。一切都很好 那有什么问题? 现在位于Seperate ResourceDictionary中的DataTemplates应该能够绑定到UserControl.

我最近正在开发一个新的用户控件,我必须使其可定制,直到我发现这不是一个问题,我必须将数据模板放入外部资源字典中,以便使控件更可定制

那我有什么? 我有一个非常可定制的UserControl,它可以调用构造函数 使用所谓的“templatePath”,将ResourceDictionary从中加载到UserControl.Resources。一切都很好

那有什么问题? 现在位于Seperate ResourceDictionary中的DataTemplates应该能够绑定到UserControl.xaml(.cs)的属性,以便检查是否选择了特定对象

但这不是唯一的问题。此外,UserControl具有预定义的命令,这些命令应该能够绑定到DataTemplates。当DataTemplates仍然在UserControl.xaml中时,这显然不是问题

糟糕的是,我真的必须外包DataTemplates,因为该控件只能作为.dll提供给用户,在这种情况下,以后就没有机会添加自定义模板了

有人知道我该如何实现这一点吗? 提前谢谢

€dit: 例如,这将是ResourceDictionary,它将在显示UserControl时动态加载:

<ResourceDictionary 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:classes="clr-namespace:CustomControl"
>
<classes:CompareNodes x:Key="CompareNodes"/>

<Style x:Key="BorderHighlightStyle" TargetType="Border">
    <Setter Property="CornerRadius" Value="6"/>
    <Setter Property="BorderBrush" Value="Gray"/>
    <Setter Property="BorderThickness" Value="2"/>
    <Style.Triggers>
        <Trigger Property="IsMouseOver"  Value="True">
            <Setter Property="Background" Value="Azure"/>
        </Trigger>
        <MultiDataTrigger>
            <MultiDataTrigger.Conditions>
                <Condition Value="True">
                    <Condition.Binding>
                        <MultiBinding Converter="{StaticResource CompareNodes}">
                            <Binding RelativeSource="{RelativeSource Self}" Path="DataContext"/>
                            <Binding Source="{Binding ???????????}" Path="SelectedItem"/>
                        </MultiBinding>
                    </Condition.Binding>
                </Condition>
            </MultiDataTrigger.Conditions>
            <MultiDataTrigger.Setters>
                <Setter Property="Background" Value="LightGoldenrodYellow"/>
                <Setter Property="BorderBrush" Value="Black"/>
            </MultiDataTrigger.Setters>
        </MultiDataTrigger>
    </Style.Triggers>
</Style>
</ResourceDictionary>


如您所见,我不知道如何绑定到UserControl.xaml(.cs)中声明的SelectedItem属性。

我自己找到了一个解决方案

我创建了一个名为“BindableProperties”的类,该类包含所有属性,这些属性应该可以从外部绑定(即“SelectedItem”)和一些命令。之后,我向ResourceDictionary添加了一个“BindableProperties”对象,然后将其加载到我的控件中

在我的控件中,我从ResourceDictionary中读取“BindableProperties”-对象,并向其提供我要绑定到的命令。每次选定项发生更改时,BindableProperties对象都会获得一个新的“selectedItem”,因此它与控件中的保持相同

好的是,类中的对象和ResourceDictionary中的对象现在是相同的,这允许我绑定到“BindableProperties”的属性,它与我的UserControl具有相同的属性


问题已解决。

对我来说,您的需求(外部自定义模板)表明自定义控件可能是更好的解决方案。你为什么不能这样做呢?我创建了一个新控件。这难道不是定制的吗?或者你的意思是我必须从控件中生成一个全新的类?我不知道这对我有什么帮助。除此之外,我想我还得从头开始。无论如何谢谢你!哎呀,我把DataTemplates误读为ControlTemplates。不要理会我说的话。您能否发布一些xaml/代码示例来说明您遇到的两个问题中的每一个?稍后我将添加一些代码。现在我正在休息。但我认为不需要这些代码。设置并不复杂。只是我不知道如何访问这些属性。因此,我有一个文件Templates.xml(ResourceDictionary),其中包含将加载到UserControl.xaml中的数据模板。UserControl.xaml具有属性“SelectedItem”。现在,我必须为DataTemplate创建一个触发器,并询问该项(DataTemplate的DataContext)是否与UserControl.xaml中的“SelectedItem”相同。显然,绑定到属性“SelectedItem”将不起作用,因为ResourceDictionary不知道UserControl.xaml(.cs)。我认为这是架构上的失败,但必须有一个解决方案。