从外包的Res​​ourceDictionary访问MainWindow.xaml.cs属性

时间:2016-01-16 00:08:11

标签: c# wpf architecture user-controls resourcedictionary

我最近正在开发一个新的 UserControl ,我必须让它可以自定义,这不是问题,直到我发现,我必须把 DataTemplates 外部ResourceDictionary 中,以使Control更具可定制性。

那我该怎么办? 我有一个非常可定制的UserControl,它可以调用构造函数 用一个所谓的" templatePath"从 ResourceDictionary将在UserControl.Resources 中加载。一切正常!

那么问题是什么? 现在位于一个单独的ResourceDictionary中的DataTemplates应该能够绑定到UserControl.xaml(.cs)的Properties以便检查i.E.如果选择了特定对象。

但这不是唯一的问题。此外,UserControl具有预定义命令,应该能够绑定到DataTemplates。在DataTemplates显然仍处于UserControl.xaml之前,这不是一个问题。

糟糕的是,我真的必须外包DataTemplates ,因为控件只能以.dll的形式提供给用户,在这种情况下,不会有任何机会之后添加自定义模板。

有没有人知道如何实现这个? 提前谢谢!

€二叔: 例如,这将是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-Property。

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。

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

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

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

问题解决了。