【发布时间】:2019-11-15 07:22:32
【问题描述】:
我使用ResourceProvider 作为我的 ResourceDictionaries 的全局管理。我将新的 ResourceDictionaries 注册到 ResourceProvider 并为每个受影响的 FrameworkElement 引发一个事件。然后,FrameworkElement 使用以下方法更新其资源:(我尝试了多种方法来解决此问题,最后我尝试使用其 Uri 更改 DataTemplate)
public void UpdateResources(FrameworkElement elementToUpdate)
{
foreach(var controlDict in _registeredResources.Where(a => a.ControlType == elementToUpdate.GetType()))
{
//elementToUpdate.Resources.MergedDictionaries.Clear();
//elementToUpdate.Resources.MergedDictionaries.Add(controlDict);
//elementToUpdate.Resources = controlDict;
ResourceDictionary dict =new ResourceDictionary() { Source = new Uri("pack://application:,,,/ApplicationCore.UITest;component/NewDataTemplate.xaml") };
elementToUpdate.Resources = dict;
//elementToUpdate.Resources.MergedDictionaries.Clear();
//elementToUpdate.Resources.MergedDictionaries.Add(controlDict);
}
}
现在,当我按下按钮更改 DataTemplate 时,用户界面不会使用新模板刷新。不得不提的是,我并没有改变对象本身。
<ctrl:TreeViewControl DataContext="{Binding}">
<ctrl:TreeViewControl.Resources>
<ResourceDictionary Source="pack://application:,,,/OldDataTemplate.xaml"/>
</ctrl:TreeViewControl.Resources>
</ctrl:TreeViewControl>
我的问题: 是否可以在运行时更改 DataTemplate 并刷新 UI 而无需更改绑定对象本身?
编辑: 我继续测试:ResourceDictionary(及其模板)已更改。新添加的项目(模板更改后)使用新模板。但是旧项目没有更新。
【问题讨论】:
-
不确定DynamicResource 是否可以在这种情况下提供帮助,但由于切换到新模板有效,只需“刷新 UI” 就足够了。尝试将
DataContext设置为null,然后恢复它(可能使用调度程序调用)。 -
除非您在数据模板中提供可组合的部分,否则更改资源不会产生任何影响。 (这个概念属于控制模板,我不知道它们也适用于数据模板)除了你已经按照这里提到的那样直接设置它the right way
-
你可以试试 DataTemplate Selector
标签: c# wpf datatemplate