从外包 ResourceDictionary 获取 MainWindow.xaml.cs 属性
Getting access to MainWindow.xaml.cs properties from outsourced ResourceDictionary
我最近在开发一个新的 UserControl,我必须让它可以自定义,这不是问题,直到我发现,我必须把 DataTemplates 在 external ResourceDictionary 中以便使控件更加可定制。
那我有什么?
我有一个非常可定制的 UserControl,它能够调用构造函数
使用所谓的 "templatePath",ResourceDictionary 将从中加载到 UserControl.Resources。一切正常!
所以问题是什么?
现在位于单独的 ResourceDictionary 中的 DataTemplates 应该能够绑定到 UserControl.xaml(.cs) 的属性,以便检查即如果选择了特定对象。
但这不是唯一的问题。此外,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-属性
我自己找到了解决办法。
我创建了一个名为 "BindableProperties" 的 class,它具有所有属性,应该可以从外部绑定(即 "SelectedItem")和一些命令。之后,我将一个 "BindableProperties" 对象添加到我的 ResourceDictionary,然后它将加载到我的控件中。
在我的控制下,我从 ResourceDictionary 中读出 "BindableProperties"-Object 并给它我想要绑定的命令。每次选定的项目发生变化时,BindableProperties-Object 都会得到一个新的 "selectedItem",因此它与控件中的一样。
好消息是,class 中的对象和 ResourceDictionary 中的对象现在是相同的,这允许我绑定到具有相同的 "BindableProperties" 的属性属性作为我的 UserControl。
问题已解决。
我最近在开发一个新的 UserControl,我必须让它可以自定义,这不是问题,直到我发现,我必须把 DataTemplates 在 external ResourceDictionary 中以便使控件更加可定制。
那我有什么? 我有一个非常可定制的 UserControl,它能够调用构造函数 使用所谓的 "templatePath",ResourceDictionary 将从中加载到 UserControl.Resources。一切正常!
所以问题是什么? 现在位于单独的 ResourceDictionary 中的 DataTemplates 应该能够绑定到 UserControl.xaml(.cs) 的属性,以便检查即如果选择了特定对象。
但这不是唯一的问题。此外,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-属性我自己找到了解决办法。
我创建了一个名为 "BindableProperties" 的 class,它具有所有属性,应该可以从外部绑定(即 "SelectedItem")和一些命令。之后,我将一个 "BindableProperties" 对象添加到我的 ResourceDictionary,然后它将加载到我的控件中。
在我的控制下,我从 ResourceDictionary 中读出 "BindableProperties"-Object 并给它我想要绑定的命令。每次选定的项目发生变化时,BindableProperties-Object 都会得到一个新的 "selectedItem",因此它与控件中的一样。
好消息是,class 中的对象和 ResourceDictionary 中的对象现在是相同的,这允许我绑定到具有相同的 "BindableProperties" 的属性属性作为我的 UserControl。
问题已解决。