我有一个控件,需要根据不同的条件设置数据模板,因此我决定使用
DataTemplateSelector
,从被分配的控件资源中选择模板。这样做是有效的,但有个问题:当文件系统发生更改并重新加载这些资源时,我需要使用新模板更新已经呈现的控件。如果我使用DynamicResource
而不是选择器,则可以实现此功能。
选择器大致如下:public override DataTemplate SelectTemplate(object item, DependencyObject container) {
//complex rules that select the template are here
//this unfortunately sets the template statically - if it changes, it won't get updated
return template;
}
如果资源发生变化,使用DynamicResource
会自动重新评估选择器,但是如果不使用DynamicResource
,选择器将永远不会被重新评估。
我有一个解决办法:在ViewModel中选择模板,这样当资源发生变化时,我可以更新DataTemplate
属性。
以下是我的ViewModel尝试(简化示例,已正确实现INotifyPropertyChange):
class MyViewModel {
public DataTemplate DataTemplate {get;set;}
public MyModel Model {
get {return _model;}
set {
if(_model != value) {
_model = value;
//Select new template here
//DUH: how do I access the resources as I would in DataTemplateSelector, when I don't have access to the container parameter?
}
}
}
}
我相信我正在错误地进行这个操作,但正确的方法是什么?出于各种原因,我不想从一些硬编码的静态位置访问资源。我真的需要在它被分配到的容器中找到它们。
我知道我的问题很令人困惑,所以请随意提问,我会尽力澄清。