我有一个在WPF中运行良好的MVVM项目。它基本上是一个TabControl,它根据所选实体的类型动态加载其TabItems。 TabItem ViewModel在运行时实例化(使用Activator.CreateInstance),以便允许反复实现新选项卡而不会影响主项目。 TabItem ViewModel类的全名可以为每种实体配置。
在WPF中,我采用了以下方法:
每个TabItem ViewModel通过从资源文件中检索它来公开其ContentTemplate:
public class CustomEntityPropertyTab : EntityPropertyTabViewModelBase
{
public override DataTemplate ContentTemplate
{
get
{
ResourceDictionary dic = new ResourceDictionary();
dic.Source = new Uri("/CustomProject;component/View/CustomProject.Resources.xaml", UriKind.RelativeOrAbsolute);
return dic["customEntityPropertyTab"] as DataTemplate;
}
}
}
主TabControl ViewModel包含一个可观察的EntityPropertyTabViewModelBase集合 - 它绑定到主视图,如下所示:
<TabControl Name="EntityPropertyPageTabControl"
ItemsSource="{Binding EntityPropertyTabs}"
SelectedItem="{Binding SelectedPropertyTab}"
>
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}"/>
<Setter Property="ContentTemplate" Value="{Binding ContentTemplate}"/>
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
但是现在,我需要在Silverlight中使用它...所以我打算在可移植类库中分离ViewModel逻辑,但它不起作用,因为PCL不支持DataTemplate财产:( 那么实现WPF和Silverlight UI之间共享的ViewModel动态加载的最佳方法是什么?
谢谢