Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVVM ViewModel构造函数多次实例化_C#_Wpf_Mvvm_Constructor_Caliburn.micro - Fatal编程技术网

C# MVVM ViewModel构造函数多次实例化

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

有人能帮我解决WPF MVVM理解问题吗? 我用caliburn.micro作为MVVM框架构建了一个MVVM项目。请容忍我,因为这是我第一次创建这种项目。网格应该显示一种主屏幕(HomeViewModel)。 因此,已将其上的绑定添加到内容控件中。 有人能帮助我并告诉我为什么HomeViewModel的构造函数被实例化了3次吗? 另一方面,如果有人能解释如何实现ViewModels的方法,我会很好?所有这些操作,包括日志记录,都会执行三次

<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();
}