【问题标题】:Getting access to MainWindow.xaml.cs properties from outsourced ResourceDictionary从外包的 ResourceDictionary 访问 MainWindow.xaml.cs 属性
【发布时间】:2023-11-01 06:50:01
【问题描述】:

我最近正在开发一个新的 UserControl,我必须使其可自定义,直到我发现我必须将 DataTemplates > 在external ResourceDictionary中,以使控件更加可定制。

那我有什么? 我有一个非常可定制的 UserControl,它能够调用构造函数 使用所谓的“templatePath”,ResourceDictionary 将从该模板加载到 UserControl.Resources。一切正常!

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

但这不是唯一的问题。此外,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-Property。

【问题讨论】:

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

标签: c# wpf architecture user-controls resourcedictionary


【解决方案1】:

我自己找到了解决方案。

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

在我的控制下,我从 ResourceDictionary 中读出了“BindableProperties”-Object 并给了它我想要绑定的命令。每次所选项目发生变化时,BindableProperties-Object 都会获得一个新的“selectedItem”,因此它与控件中的相同。

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

问题已解决。

【讨论】: