避免定位器膨胀

时间:2013-06-21 18:31:52

标签: mvvm-light

几年后,只需启动MVVM光源的新项目。我使用ViewModelLocator连接我的第一个VM,我发现对于每个新的视图模型,我们需要创建一个新属性。我只是想知道如何避免这种情况,因为应用程序最终可能会有很多视图模型(50+)。我已经使用值转换器工作,但后来我在XAML编辑器中失去了智能。

对于可能有解决方案的人的任何例子表示赞赏。

注意 - 这是一个使用值转换器的解决方案,因此我可以将参数传递到某个IoC并获取VM,但随后我松开了intellisense(WelcomeTitle得到了波形)。

<Window x:Class="My.MainWindow" 
DataContext="{Binding Source={StaticResource Locator}, 
Converter={StaticResource Locator}, ConverterParameter='foo'}">

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Skins/MainSkin.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Window.Resources>

<Grid x:Name="LayoutRoot">
    <TextBlock FontSize="36"
               FontWeight="Bold"
               Foreground="Purple"
               Text="{Binding WelcomeTitle}"
               VerticalAlignment="Center"
               HorizontalAlignment="Center"
               TextWrapping="Wrap" />
</Grid>
</Window>

更新: 这是另一种方法,比使用转换器更好,但仍然受到WelcomeTitle波形的影响,因为XAML编辑器不知道类型。我想知道这种影响和#34;可混合性&#34 ;? (我没有混合方便。)

http://maartendewilde.blogspot.com/2011/01/auto-viewmodel-binding-with-ninject.html

由于

1 个答案:

答案 0 :(得分:1)

对于intellisense,您可以尝试更多资源上的样板吗?

/// <summary>
/// Class to contain things
/// </summary>
/// <typeparam name="T">UserID</typeparam>
/// <typeparam name="TK">UserName</typeparam>
public class MyDictionary<T,TK> : Dictionary<T,TK>

或者使用共享资源字典使intellisense满意呢?

依赖注入是减少冗余定位器代码的好方法。它涉及注册服务或模型提供者的通用方法。 From the MSDN.

如果必须为每个视图模型创建新属性,则可能表示实际模型存在缺陷。在使用VM时,我通常会发现它们是还原性的,因为模型包含所有相关数据,并且视图模型被构造为对该视图重要的属性的子集。

大型项目拥有50多个视图模型并不罕见。