问题标签 [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 回答
2257 浏览

wpf - ContentTemplateSelector 不会重新评估绑定更改

前言

我创建了两个不同的数据 DataTemplates 以允许更快地加载我的数据网格单元格。一个基本上是文本块,另一个是更昂贵的 UserControl。在加载时,数据模板选择器决定它是否需要加载便宜还是更昂贵的控件,这将首次加载/性能从约 12 秒降低到约 2 秒,因为大多数单元格不需要复杂且与其他模板相比,加载一个简单模板所需的时间几乎没有。

无论如何,它在负载时效果很好。但是,当我更改下面的数据时,这会引发属性更改并且应该强制 DataTemplateSelector 再次调用 SelectTemplate() 以重新评估要使用的数据模板 - 好吧,它没有。

有趣的是,在上述失败之后,当我单击一个单元格时,它会调用 SelectTemplate() 并在需要时翻转 DataTemplate。

代码

请注意,由 DataTemplate Selector 选择的更复杂的控件可以完美地工作,因为我在没有 DataTemplateSelector 的情况下对其进行了测试。另外,关于 Binding Intervals[0].Self - self 是一个返回“this”的属性,这是我绑定到的对象的引用,唯一的原因是(当 Self 被提升时)到强制重新评估 DataTemplate。显然这并不完全奏效。

问题

如何强制数据模板重新评估?

支持代码*

这是我的资源字典(没什么花哨的)

显然我有 MyTemplateSelector 类覆盖 SelectTemplate 并且工作得很好......

0 投票
2 回答
2473 浏览

wpf - WPF ContentTemplateSelector 怪异

目标:我希望拥有一个包含我的数据的对象,并将其绑定到 ContentPresenter,该 ContentPresenter 使用自定义 ContentTemplateSelector 选择适当的数据模板以在主控件中呈现。

问题: DataTemplate 在主控件中没有按预期呈现;它不呈现指定的视图控件。

代码:

MainView.xaml:

数据对象.cs:

ObjectWrapper.cs:

模板选择器.cs:

查看.xaml:

概括:

  • ObjectWrapper 初始化。
  • DataObject 初始化。
  • 在初始化时,TemplateSelector 创建一个新的 DataTemplate。
  • 创建的 DataTemplate 在其构造函数中使用 View 类型。
  • 对象全部初始化,主视图的datacontext设置为DataObject,视图仍然没有渲染到主窗口。
0 投票
1 回答
661 浏览

wpf - WPF TabControl - 我是否需要 ItemTemplateSelector *和* ContentTemplateSelector?

所以我在我的 WPF 应用程序中拥有一个主要的用户控件TabControl,它将支持几个不同的视图(基本上是用于数据输入的表单)及其底层视图模型(基本上是 ORM 映射。)

我构建了一个ContentTemplateSelector为所选项目抛出正确的内容视图。

所以我的问题是:

我应该建立一个ItemTemplateSelector选择将从底层视图模型中选择正确的属性,该模型将充当标签标题标题吗?

或者,我应该将每个视图模型的属性分配给另一个名为 DisplayTitle 的属性,然后在ItemTemplate?

更一般地说,有没有办法将 ItemTemplate 和 ContentTemplate 的“选择”组合在一个选择器下?

0 投票
1 回答
12684 浏览

c# - ContentControl.ContentTemplateSelector 动态选择模板

我在Window的右边设置了一个ContentControl,并设置了Content binding Items(它的类型是ObservableCollection)。现在我想实现它:如果没有item,ContentControl选择第一个DataTemplate,然后在items中添加一个item,ContentControl会选择第二个DataTemplate来显示一些信息。

像这样:

在此处输入图像描述

问题是当我将一项添加到项目中时,ContentControl 没有更新和更改 DataTemplate,我尝试设置模式、UpdateSourceTrigger 等,但失败了。在 ViewModel 中,删除一个项目后,我使用这个语句,它会很好地工作<1>

.

.

编辑: 删除一项后使用这种方式也失败:

但我想知道为什么它与<1>配合得很好。

Edited2 这是声明:

0 投票
1 回答
114 浏览

wpf - 使用模板在 XAML 中显示 Windows 应用商店/WinRT 中的三种不同状态

我提供了三种不同形式的模型,它们表示Employee 对象空、处于编辑状态和已保存状态时。我没有使用 WPF 或 Silverlight,而是使用WinRT / Windows Store

实现此 UI 的方法很少。第一种方法是拥有三个不同的用户控件。当有 10 个这样的实体 - 30 个表格来管理一个实体的状态时,这太多了。单个用户控件包含一个包含三个不同数据模板的内容控件和一个内容模板选择器,比以前的方法更易于管理。

我知道VisualStateManager适用于其视觉状态必须根据事件发生变化的控件。VisualStateManager 对我上面描述的 UI 场景有用吗?或者使用带有内容模板选择器的内容控件是解决这个问题的正确方法?

技术挑战是应用程序有许多实体/对象,并且第一个屏幕(空状态)至少应该可用于所有实体。第二种和第三种形式不可能是因为它们对于每个实体都是不同的。

请分享您解决此问题的方法 - DataTemplate Vs VisualStateManager Vs Style

Employee 对象处于三种不同的状态

0 投票
1 回答
282 浏览

c# - WPF ContentTemplateSelector 不会及时更改 ListboxSelectionChanged 的​​模板

我有一个按预期成功更改的 ContentTemplateSelector。它在一个列表框中,其中包含一堆文本块,然后当您在列表框中选择一个项目时,该项目会将其模板更改为具有一个文本框(因此可以对其进行编辑)。

我遇到的问题是文本框没有获得焦点。这有点烦人。

所以我一直在尝试为列表框实现一个附加属性,该属性在设置时会将一个事件处理程序附加到 SelectionChanged 事件。从那里,我希望向下钻取,找到文本框并设置其焦点。

但是,我遇到了一个障碍,似乎 TemplateSelector 尚未选择合适的模板(带有文本框的模板)。事实上,Template 是 NULL。这让我相信它已经删除了 TextBlock 模板,并且很快就会选择正确的模板,但只有在整个 SelectionChanged 事件完成之后。

我的问题是,您是否知道一种方法可以强制此 DataTemplate 告诉它的 ContentTemplateSelector 选择适当的模板,或者,当 ListboxItem 获得焦点时,关于如何在模板中选择此文本框的不同想法?

以下是我获取 ContentPresenter 的方法(来自所选的 ListboxItem):

编辑:我在此之后添加了cp.ApplyTemplate(),但这并没有改变任何东西。

不过此时 cp.ContentTemplate为空。

0 投票
0 回答
246 浏览

wpf - 内容选择器 WPF

我想在按钮内设置一个不同的内容模板,就像一个切换按钮一样,这取决于我的 ViewModel 的状态。我已经相当简化了代码,但是在每个数据模板中,按钮的内容绘制了不同的路径几何图形,以及一个文本块。

内容选择器类:

编辑:向按钮添加属性以设置其内容,其中“状态”是我的 ViewModel 中的布尔值,转换器只是根据我的 ViewModel 的状态返回“T”或“F”

XAML:

我似乎无法在我的 ContentSelector 类中打断点。它在设计器中确实有效,这意味着如果我将按钮的内容更改为“T”或“F”,如果我将其更改为在 ContentSelector 类中返回相应的 DataTemplate,但是当我运行应用程序时它永远不会点击 ContentSelector,并且内容该按钮是完全空的。

关于为什么会发生这种情况的任何想法?我尝试将按钮的内容设置为我的 ViewModel 的状态,并使用转换器将其更改为布尔值,认为必须设置按钮的内容才能触发 ContentSelector,但它没有工作。

0 投票
1 回答
1126 浏览

c# - 如何将参数传递给 ContentTemplateSelector?

我希望TemplateSelector根据国家/地区选择模板。所以,为了MyDataTemplateSelector:SelectTemplate接收我绑定ContentContentPresenter的国家CountriesComboBox。问题是返回的模板未绑定到Cityor Streets。我认为这是因为DataContext所选模板未绑定到 ViewModel,因此无法访问模板的有界属性。

我尝试了下面的代码,但在我看来,它不起作用,因为ContentofContentPresenter是绑定的,CountriesComboBox而不是{Binding}应该的。但是,如果我绑定Content{Binding},我将无法访问CountriesComboBox从 TemplatrSelector 中选择的项目。

那么,我该怎么做呢?

0 投票
1 回答
1382 浏览

wpf - 具有多个 ItemTemplateSelector 的 ItemsControl

我有这个 ScrollViewer:

ItemsControl我用一个具有一个布尔参数的类填充。如果是真的,我想打电话给一个ItemTemplateSelector;还有一个是假的。

我正在尝试这样的事情:

这是正确的方法吗?

0 投票
1 回答
657 浏览

wpf - 无法在 DataGridColumnHeader 上同时设置 ContentTemplateSelector 和 Template 属性

简而言之,问题标题说明了一切。对于那些想要更多细节的人,这里是我的问题的症结所在:我需要对控件ControlTemplate中的DataGridColumnHeader元素应用自定义DataGrid,但我还需要根据最靠近标题的单元格数据对它们进行不同的样式设置。但是,当我在一个元素上同时设置ContentTemplateSelector 属性时,不会调用设置为属性值的。注释掉属性设置证实了这种情况,因为现在将调用该元素。TemplateDataGridColumnHeaderDataTemplateSelectorContentTemplateSelectorTemplateDataTemplateSelector

是的,我知道你们喜欢看一些代码,但是我已经将整个DataGrid控件完全模板化为看起来像 Excel,所以你可以想象,我有太多代码要在这里显示。但只是为了取悦你代码饥饿的开发人员,我在一个更简单的例子中重新创建了我的问题......让我们首先看看 XAML:

现在最简单的DataTemplateSelector类:

在 XAML 中,我们看到一个DataGrid,只有一个DataGridTemplateColumn和三个字符串值,每行一个,以及一些资源。该部分中有一个StyleforDataGridColumnHeader元素,对其Resource进行了最简单的ControlTemplate设置,它只包括默认的所需命名部分ControlTemplate

如果您按原样运行应用程序,那么它当前不会Debugger.Break()在类中的方法处中断StringDataTemplateSelector。这是出乎意料的。如果您现在注释掉 中的Template属性设置Style并再次运行应用程序,那么您现在将看到程序执行现在将在该Debugger.Break()方法处中断,正如预期的那样。

更多信息

ContentControl.ContentTemplateSelector在 MSDN属性页面的备注部分中,它指出

如果同时设置了ContentTemplateSelectorContentTemplate属性,则忽略此属性。

但是,它没有提及该属性,并且在 MSDN 的“属性”页面上Template也没有提及这一点。Control.Template

此外,我使用一个简单的控件尝试了相同的设置Button,并且可以确认同时设置ContentTemplateSelectorContentTemplate属性不会阻止StringDataTemplateSelector类被调用:

因此,我所追求的是一种将自定义ControlTemplate元素应用于DataGridColumnHeader对象的方法,但仍然能够DataTemplateSelector在渲染过程中调用该类。