我有两个视图和一个viewModel作为dataContext。启动应用程序后,它启动了两个viewModels实例。问题是如何只创建一个实例。我正在使用mvvm灯。抱歉我的英语:)
答案 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(如果有的话)。