C# MVVM ViewModel构造函数多次实例化
有人能帮我解决WPF MVVM理解问题吗? 我用caliburn.micro作为MVVM框架构建了一个MVVM项目。请容忍我,因为这是我第一次创建这种项目。网格应该显示一种主屏幕(HomeViewModel)。 因此,已将其上的绑定添加到内容控件中。 有人能帮助我并告诉我为什么HomeViewModel的构造函数被实例化了3次吗? 另一方面,如果有人能解释如何实现ViewModels的方法,我会很好?所有这些操作,包括日志记录,都会执行三次C# MVVM ViewModel构造函数多次实例化,c#,wpf,mvvm,constructor,caliburn.micro,C#,Wpf,Mvvm,Constructor,Caliburn.micro,有人能帮我解决WPF MVVM理解问题吗? 我用caliburn.micro作为MVVM框架构建了一个MVVM项目。请容忍我,因为这是我第一次创建这种项目。网格应该显示一种主屏幕(HomeViewModel)。 因此,已将其上的绑定添加到内容控件中。 有人能帮助我并告诉我为什么HomeViewModel的构造函数被实例化了3次吗? 另一方面,如果有人能解释如何实现ViewModels的方法,我会很好?所有这些操作,包括日志记录,都会执行三次 <Window [...]> <Wi
<Window [...]>
<Window.DataContext>
<viewModels:ShellViewModel />
</Window.DataContext>
<Grid>
<Grid.Resources>
<DataTemplate DataType="{x:Type viewModels:HomeViewModel}">
<local:HomeView DataContext="{Binding}" />
</DataTemplate>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="0.5*"/>
<ColumnDefinition Width="0.5*"/>
</Grid.ColumnDefinitions>
<ContentControl Grid.Column="1">
<ContentControl.Content>
<Binding FallbackValue="{x:Null}"
Mode="OneWay"
Path="viewModels:HomeViewItem"
RelativeSource="{RelativeSource Self}" />
</ContentControl.Content>
</ContentControl>
</Grid>
应用程序启动时,调试输出中有3个HomeViewModel实现条目:
Hello from HomeVM
Hello from HomeVM
Hello from HomeVM
如果多次调用构造函数,容器中的单例DI应该返回现有实例,不是吗?
顺便说一下:StartupUri已从app.xaml中删除。
提前谢谢 此标记调用ShellViewModel的构造函数
<Window.DataContext>
<viewModels:ShellViewModel />
</Window.DataContext>
这里还有两个电话
GetType().Assembly.GetTypes()
.Where(type=>type.IsClass)
.Where(type=>type.Name.EndsWith(“视图模型”))
.Where(type=>!(String.IsNullOrWhiteSpace(type.Namespace))&&type.Namespace.EndsWith(“视图模型”))
.ToList()/_container.RegisterSingleton(
viewModelType,viewModelType.ToString(),viewModelType));
总计:3次。完全正确
单例是危险的。当您在XAML中设置将创建实例的DataContext时。CreateSourceItem方法创建实例和DI容器。1+1+1=3 q.e.d.提前感谢!有没有一种最佳实践方法可以将其结合起来?@AtzeBK您应该选择初始化实例的唯一方法。手动或单例实现。就这样。
public class ShellViewModel : Screen
{
private IScreen _homeViewItem;
public ShellViewModel()
{
CreateSourceItem();
}
public IScreen HomeViewItem
{
get => _homeViewItem;
set
{
if (Equals(value, _homeViewItem))
return;
_homeViewItem = value;
NotifyOfPropertyChange(() => HomeViewItem);
}
}
private void CreateSourceItem()
{
HomeViewItem = new HomeViewModel();
}
}
Hello from HomeVM
Hello from HomeVM
Hello from HomeVM
<Window.DataContext>
<viewModels:ShellViewModel />
</Window.DataContext>
public ShellViewModel()
{
CreateSourceItem();
}
private void CreateSourceItem()
{
HomeViewItem = new HomeViewModel();
}