将ViewModel放在正确的位置

时间:2017-03-08 18:51:16

标签: .net xaml silverlight mvvm

我有一个silverlight项目。在App.xaml中,我们有

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

然后在Assets/Styles.xaml中,我们有了ViewModel。

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"
xmlns:local="clr-namespace:MyWeb.MyProj"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:localViewModels="clr-namespace:MyWeb.MyProj.ViewModels">

<ResourceDictionary.MergedDictionaries>

</ResourceDictionary.MergedDictionaries>

<localViewModels:MyProjViewModel x:Key="ViewModel" />
...
<telerikGridView:RadGridView
    ...
    ItemsSource="{Binding Schedules}"
    SelectedItem="{Binding SelectedWeek, Mode=TwoWay, Source={StaticResource ViewModel}}">

最后在MainPage.xaml.cs中,我们有

private MyProjViewModel viewModel;

public MyProjViewModel ViewModel
{
    get
    {
        if (this.viewModel == null)
        {
            this.viewModel = new MyProjViewModel();
        }
        return this.viewModel;
    }
    set
    {
        if (this.viewModel != value)
        {
            this.viewModel = value;
        }
    }
}

然后在构造函数中,我们使用ViewModel作为

public MainPage()
{
    InitializeComponent();
    this.DataContext = this.ViewModel;
    this.ViewModel = this.DataContext as MyProj;
}

虽然它有效,但我不确定它是否是使用ViewModel的最佳结构,因为它放在Styles.xaml中。如果没有,如何纠正?

1 个答案:

答案 0 :(得分:0)

如果您希望ViewModel的一个特定实例可用于应用程序的整个生命周期,您可以在资源字典中定义它,就像您一样(当然您必须从资源字典中引用它)不要像你在问题中那样使用。)

更好的解决方案是在视图的构造函数中创建它(没有styles.xaml中的定义)。

public MyProjectViewModel ViewModel { get; set; }

public MainPage()
{
     InitializeComponent();
     this.ViewModel = new MyProjViewModel();
     this.DataContext = this.ViewModel;
}