所以在经典MVVM示例中,我看到DataTemplate定义用于将View Models映射到Views,在MVVM Light框架中执行此操作的标准方法是什么,以及映射应该放在何处?以下是我现在正在做的事情和我正在谈论的内容的例子,可混合性对我来说很重要!
主窗口:
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="STS2Editor.MainWindow"
Title="{Binding ApplicationTitle, Mode=OneWay}"
DataContext="{Binding RootViewModel, Source={StaticResource Locator}}">
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Skins/ApplicationSkin.xaml" />
<ResourceDictionary Source="Resources/ViewMappings.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Window.Resources>
<Grid>
<ContentControl Content="{Binding ApplicationManagementViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我的RootViewModel类有一个ApplicationManagementViewModel类的实例,它具有相同的属性名:
public ApplicationManagementViewModel ApplicationManagementViewModel {get {...} set {...} }
Run Code Online (Sandbox Code Playgroud)
我引用ResourceDictionary"ViewMappings.xaml"来指定我的视图模型如何表示为视图.
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:STS2Editor.ViewModel">
<DataTemplate DataType="{x:Type local:ApplicationManagementViewModel}">
<local:ApplicationManagementView/>
</DataTemplate>
</ResourceDictionary>
Run Code Online (Sandbox Code Playgroud)
我应该使用ViewModelLocator做这样的事情吗?那些视图模型的集合呢?
我觉得我仍然看到很多指导和建议,说明视图优先方法是在应用程序中获得Blendability的最佳方法.但是,使用d:DataContext,d:DesignData和d:DesignInstance,无论您的视图和视图模型如何连接在一起,Blendability的问题都不容易解决?
使用DesignInstance,您只需选择要在设计器中使用的具体ViewModel类型,就好像您已经拥有了视图优先组合.实际上,使用DesignInstance实际上可以比执行IsInDesignMode后空翻更好地分离关注点,或者只为真实视图模型中的设计支持创建默认构造函数 - 您可以从viewmodel类型继承或从公共接口类型继承以创建简单的"设计器" viewmodel,它完全受限于设计师.使用DesignData,您甚至不必这样做:您可以在XAML中以声明方式创建伪视图模型.
确实,在进行上述活动时需要很小的前期成本,但结果实际上比通过将设计数据与真实视图模型混合得到的结果更清晰.有什么我想念的吗?为什么Blendability仍然是一个如此大的问题?
我有一个ac #control库,它包含我的模型,视图模型和视图.我像往常一样把所有东西都挂了,但我没有得到visual studio的设计师的任何设计时间反馈(可混合性).
当我在WPF项目中加载我的assambly并将视图包含为自定义用户控件时,我将得到我的设计时间反馈.不幸的是,这个WPF项目只是一个测试shell,因为该视图将存在于另一个应用程序中.
如果我可以在类库中使用可混合性(设计时)支持,那么对我的dev管道会更有效吗?是什么让visual studio开始展示我的设计时间datacontext?
我甚至d:DataContext="{d:DesignInstance dd:DesignViewModel}"在我的类库中使用.类库中没有设计时数据.
我在XAML可视化树中有一些图像.我想显示一个设计时图像,这样我就可以检查布局,尺寸等等.这相当于:
<UserControl.Resources>
<Something x:Key="DesignSource" Uri="/Image/sourceimage.png"/>
</UserControl.Resources>
<Image
Source="{Binding RealSource}"
d:Source="{StaticResource DesignSource}"/>
Run Code Online (Sandbox Code Playgroud)
其中"某些东西"是某些图像源提供者指向某个图像文件,而"d:Source"只是为了显示我的意图:同时定义不同的源:一个用于运行时,另一个用于设计时.
欢迎在XAML或SampleData(Blend)中使用DataProviders(我知道它们存在,但不知道如何包含图像).