c#wpf mvvm light几个视图的一个视图模型实例

时间:2015-12-28 18:24:18

标签: c# wpf mvvm

我有两个视图和一个viewModel作为dataContext。启动应用程序后,它启动了两个viewModels实例。问题是如何只创建一个实例。我正在使用mvvm灯。抱歉我的英语:)

2 个答案:

答案 0 :(得分:0)

不要使用DataContext而是使用StaticResource!

试试这个:

第一次观看

<FirstView.Resources>
  <local:CommonViewModel x:Key="commonVM"/>
</FirstView.Resources>  

对第二个视图执行相同的操作。现在,当您绑定某些内容时,请将该密钥称为StaticResource,如:

<TextBlock Text={Binding someTextProp,Source={StaticResource commonVM}}/>

这应该有效

答案 1 :(得分:0)

好的,如果我明白你在说什么 您获得了View-Model的两个实例,但实际上您只需要一个可以在两个视图之间共享的View-Model实例。

在ViewModelLocator类中注册View-Model: (如果您创建了一个新的MVVM Light项目,则应该创建它。)

public class ViewModelLocator
{
    static ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

        if (ViewModelBase.IsInDesignModeStatic)
        {
            SimpleIoc.Default.Register<Model.IDataService, Data>();
        }
        else
        {
            SimpleIoc.Default.Register<Model.IDataService, Model.DataService>();
        }

        SimpleIoc.Default.Register<MainViewModel>();

    }

    /// <summary>
    /// Gets the Main property.
    /// </summary>
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Performance",
        "CA1822:MarkMembersAsStatic",
        Justification = "This non-static member is needed for data binding purposes.")]
    public MainViewModel Main => ServiceLocator.Current.GetInstance<MainViewModel>();


    /// <summary>
    /// Cleans up all the resources.
    /// </summary>
    public static void Cleanup()
    {
    }
}  

然后确保从ViewModelLocator类中为View-Model提供的名称获取两个Views的DataContext,在我的示例中将其设置为Main。您可以使用ViewModelLocator作为View的XAML代码中的静态资源来执行此操作 - 如下所示:

<Window x:Class="mvvmLight.View.YourView"
    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"
    DataContext="{Binding Main, Source={StaticResource Locator}}">  

很高兴看到你的一些代码,这样可以更容易地找到问题 粘贴视图的DataContext绑定以及View-Model和ViewModelLocator(如果有的话)。