c#wpf-mvvm点亮多个视图一个视图模型实例

本文关键字:视图 一个 模型 实例 c#wpf-mvvm | 更新日期: 2023-09-27 18:28:13

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

c#wpf-mvvm点亮多个视图一个视图模型实例

不要使用DataContext,而是使用StaticResource!

试试这个:

对于第一视图

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

对第二个视图执行相同操作。现在,当您绑定某个东西时,请将密钥作为StaticResource提及,如:

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

这应该工作

好吧,如果我理解你的意思
您获得了视图模型的两个实例,但实际上您只希望在两个视图之间共享一个视图模型实例。

在ViewModelLocator类中注册视图模型:(如果你做了一个新的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类中为视图模型提供的名称中获得两个视图的DataContext,在我的示例中,它被设置为Main。您可以使用ViewModelLocator作为视图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}}">  

如果能看到您的一些代码会很好,这样可以更容易地找到问题
粘贴视图以及视图模型和ViewModelLocator(如果有)的DataContext绑定。