问题标签 [contenttemplateselector]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
29 浏览

wpf - WPF:如何检索由 ContentTemplateSelector 为特定 ContentPresenter 创建的模板?

在我的 WPF 应用程序中,我使用了几个带有特殊 MarkupExtension 的 ContentPresenter,需要访问 ContentPresenter 的 ContentTemplate 属性。

MarkupExtension 工作得很好,除了我刚刚发现如果 ContentPresetner 使用 ContentTemplateSelector,它不会设置自己的 ContentPresenter 属性:相反,ContentPresenter 和 ContentTemplateSelector 的结果都保存到 ContentPresenter 的私有变量类,可以在这里看到:链接到 ContentPresenter 的 .Net 源代码

我发现我可以再次调用 ContentTemplateSelector.SelectTemplate() 并获取模板,或者在 ContentTemplateSelector 中保留所选模板的字典,以便我可以获取为每个元素生成的模板,但是有没有更好的方法来做到这一点?

0 投票
0 回答
147 浏览

c# - xaml - 如何指定使用哪个 ContentTemplateSelector?

我见过很多例子,内容控件的ContentTemplateSelector属性被分配了一个StaticResource.

例子:<ContentControl Content="{Binding}" ContentTemplateSelector="{StaticResource MyTemplateSelector}"/>

MSDN 状态:

通常,当您为同一类型的对象拥有多个 DataTemplate 并且您希望提供自己的逻辑以根据每个数据对象的属性选择要应用的 DataTemplate 时,您会创建一个 DataTemplateSelector。

来源:DataTemplateSelector 类

知道这一点 - 我的情况是我有两种类型的对象 ,其中每个对象都有自己的一组可以使用的数据模板。有什么方法可以简单地将内容控件ContentTemplateSelector 绑定ContentTemplateSelector视图模型上的属性?棘手的部分是数据模板是在 xaml 文件中定义的——我不能只ContentTemplateSelector为该类初始化一个特定的新实例。

附加信息:我有一个父视图模型,其中每个子类都应表示为不同类型的 object。因此,根据切换的子类视图模型,它应该使用其各自ContentTemplateSelector的数据模板。

我也让上面的内容与转换器一起工作,但我想远离这个。理想情况下,我希望拥有使此过程尽可能通用的代码。即不需要维护转换器代码以在将来添加新类型的对象只是为了返回正确的DataTemplateSelector。情况应该是,只要添加了新的子类,它就会立即工作。

0 投票
0 回答
51 浏览

wpf - 如何在为 ContentPresenter(或 ContentControl)加载 DataTemplate 时发出通知

我知道有人问过类似的问题,作为解决方案,建议将内容包装在带有 Grid 的 DataTemplate 中并使用 Grid_Loaded 方法。但是,如果我假设我的模板选择器将根据条件一次选择 10 个 DataTemplates,那么我需要为 xaml 中的每个 DataTemplate 添加此 Grid_Loaded 事件处理程序。我正在寻找另一种不需要我重复代码的方法。

而我的模板选择器定义如下(传入的项目基本上是DataContext的MyViewModelProperty的值)

只是为了让您知道我尝试使用 ContentControl 而不是 ContentPresenter,甚至创建了我自己的继承自 ContentControl 的 CustomContentControl 并覆盖了 OnContentTemplateChanged 和 OnTemplateChanged 处理程序,但是每次更改 MyViewModelProperty 的值时,这些处理程序都不会被调用。

注意,调用模板选择器并根据 MyViewModelProperty 值返回正确的模板,但在选择模板后不会调用上述 OnContentTemplateChanged 和 OnTemplateChanged 处理程序。如果我有一个 Grid 作为我的 DataTemplates 中的第一个元素并订阅 Loaded 事件,那么它会在 DataTemplate 之后立即调用,因此,Grid 元素会被加载。

关于如何避免将 Loaded 处理绑定到内部网格,而不是在我们知道 ContentControl 的模板被选择器选择并加载时以某种方式触发的任何想法?提前非常感谢。