2016-09-21 59 views
0

即时通讯使用MVVMLight Toolkit for WPF和C#。 有一个带有窗口(Shell)的WPF应用程序和一个控件是(UI)的程序集。 ViewModels位于第三个DLL(BIZ)中。MVVMLight DataTemplates in assembly ressource dictionary

窗口中显示的唯一东西是一个名为“ShellView”的控件,它是主UI部分。我这样做是为了能够在不同的窗口中重用大部分应用程序。

目前我在“Shell”App.config中执行view和viewmodel之间的所有绑定。

从来就引用:

的组件名称空间

xmlns:views="clr-namespace:Application.UI;assembly=Application.UI" 
xmlns:vm="clr-namespace:Application.BIZ;assembly=Application.BIZ" 

视图模型定位器

<vm:ViewModelLocator xmlns:vm="clr-namespace:Application.BIZ;assembly=Application.BIZ" x:Key="Locator" d:IsDataSource="True" /> 

和所使用的的DataTemplates

<DataTemplate 
    DataType="{x:Type vm:ShellVM}"> 
<views:ShellView /> 

因此,如果我将内容控件的内容绑定到一个“ViewModelBase”类,视图会自动显示 - 一切正常。

现在我试图将数据模板的定义移动到UI组件中,并在窗口应用程序中引用它。因此,所有模板和绑定都是在UI组件中完成的,并且该窗口只引用所有程序集并显示“ShellView”。

我的问题是: 这是可能的,我该如何引用App.xaml中的程序集?目前即时通讯许多xaml解析异常。

预先感谢您

回答

0

像这样的事情应该工作,在新的项目中添加资源字典和您的模板添加到它

<ResourceDictionary> 
<DataTemplate x:Key="Foo" > 
</ResourceDictionary> 

而在你的App.xaml

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      path to your Foo datatemplate for example 
      <ResourceDictionary Source="MyAssembly;component/MyFolder/MyResourceDictionary.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 
</Application> 

然后从您的代码中,您只需将其作为StaticResource引用它即可

示例

<ListBox ItemTemplate="{StaticResource Foo}"/> 
+0

数据模板未在主应用程序窗口xaml中使用。只有在控制库中,你的解决方案也能工作吗?我通常只将它们用于View-ViewModel绑定:数据模板完成其余的任务 – pwoestmann

+0

@pwoestmann您可以在任何项目中使用app.xaml。但是在运行期间只使用exe项目中的一个。所以如果你想坚持这个解决方案,你将不得不复制这个资源部分。所以在你想要消费你的数据模型的项目中,所以设计者不会抱怨,而且一个在主项目中,所以当它运行时知道在哪里找到它们。 – adminSoftDK