从 DataTemplateSelector 显式刷新 DataTemplate?
我将 ContentControl.DataTemplateSelector 设置为我想要的。
我希望根据命令或其他方式,调用 ContentControl 通过 xaml 或代码从选择器中重新选择模板。
感谢
I set up a ContentControl.DataTemplateSelector to my desired one.
I want that according to a command or whatever, call the ContentControl to reselect the template from the selector by either xaml or code.
Thank
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我知道,聚会迟到了。 =)
当面对这个问题时,我发现最简单的方法是显式设置一个新的 TemplateSelector,例如
Late to the party, I know. =)
When faced with this problem, I found it easiest to explicitly set a new TemplateSelector like
我想我参加聚会的时间甚至更晚,但是对于可能对某人有所帮助的不同想法...
您也可以尝试在
ContentControl
的上使用
属性而不是ValueConverter
ContentTemplateDataTemplateSelector
。只需在
DataContext
中有一个属性即可绑定,例如ScreenNumber
。然后在ValueConverter
中返回与ScreenNumber
关联的DataTemplate
。ValueConverter 示例:
xaml 资源示例:
I guess I am even later to the party, but for a different idea that may help someone...
You could also try using a
ValueConverter
on theContentControl
sContentTemplate
property instead of aDataTemplateSelector
.Just have a property in your
DataContext
to bind, likeScreenNumber
for example. Then in theValueConverter
return theDataTemplate
that is associated with theScreenNumber
.Example ValueConverter:
Example xaml resource:
我不知道有任何(非笨拙的)方法可以做到这一点:当 WPF 需要选择模板时,将调用 DataTemplateSelector,就 WPF 而言,这是一个一次性决定。 (你可以通过让 WPF 认为内容已经改变来拼凑它,例如通过将内容设置为 null 然后再返回 - 我认为这会起作用,但还没有测试它 - 但这是相当丑陋的!)如果有一个很好的方法,我也有兴趣知道!
但是,还有另一种方法可以更改内容的显示方式,并根据数据更改进行更新,那就是通过触发器。您可以使用
DataTemplate.Triggers
集合中的 DataTriggers 来根据内容数据显示和隐藏元素。要更改整个显示,您可以在网格中设置两个渲染,并使用触发器来控制哪一个可见。您甚至可以将数据模板设为 ContentControl,并使用触发器来更改 ContentTemplate。当然,这取决于将模板更改为可绑定属性的标准,但情况可能并不总是如此。这里有一些对选择器与触发器的简要讨论,尽管上下文略有不同。
I'm not aware of any (non-kludgy) way to do this: the DataTemplateSelector is called when WPF needs to select the template, and that's a one-off decision as far as WPF is concerned. (You can kludge it by making WPF think the content has changed, e.g. by setting the content to null and then back again -- I think that would work but haven't tested it -- but this is pretty ugly!) If there is a nice way to do this I too would be interested to know!
However, there is an alternative way to change how content is displayed that does update in response to data changes, and that is through triggers. You can use DataTriggers in your
DataTemplate.Triggers
collection to show and hide elements depending on the content data. To change the entire display, you could e.g. set up two renderings in a Grid, and use triggers to control which one is visible. You could even make your data template a ContentControl, and use a trigger to change the ContentTemplate. Of course this depends on the criteria for changing the template being bindable properties, which may not always be the case.Here's some brief discussion of selectors vs. triggers, albeit in a slightly different context.
与 Jens 的回答类似,您可以使用 DataTemplateSelector 的现有实例,而不是创建新实例。
Similar to Jens answer, instead of creating a new instance , you can use the existing instance of the
DataTemplateSelector
.