c#wpf-mvvm点亮多个视图一个视图模型实例
本文关键字:视图 一个 模型 实例 c#wpf-mvvm | 更新日期: 2023-09-27 18:28:13
我有两个视图和一个viewModel作为dataContext。启动应用程序后,它会启动viewModels的两个实例。问题是如何只创建一个实例。我用的是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绑定。