Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.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中的更改?_C#_Wpf_Mvvm - Fatal编程技术网

为什么在调用带参数的构造函数之后调用无参数构造函数,删除我在C#MVVM中的更改?

为什么在调用带参数的构造函数之后调用无参数构造函数,删除我在C#MVVM中的更改?,c#,wpf,mvvm,C#,Wpf,Mvvm,我正在使用WPF创建一个桌面应用程序和MVVM,没有任何框架作为体系结构。在XAML中,我有一个绑定了PersonViewModel名称变量的文本框: <TextBox Text="{Binding Name}"/> 然后是绑定到PersonView的ViewModel: public class PersonViewModel: ViewModelBase { public string _Name; public string Name{ get

我正在使用WPF创建一个桌面应用程序和MVVM,没有任何框架作为体系结构。在XAML中,我有一个绑定了PersonViewModel名称变量的文本框:

<TextBox Text="{Binding Name}"/>
然后是绑定到PersonView的ViewModel:

public class PersonViewModel: ViewModelBase
{
    public string _Name;
    public string Name{
        get => _Name;
        set{ _Name = value; OnPropertyChanged(); }
    }

    public PersonViewModel(){}

    public PersonViewModel(Person person){
        Name = person.Name;
    }
}
在MainWindowViewModel中,我创建了PersonViewModel的一个新实例,这将更改PersonView所在的MainWindow的
ContentControl
Content属性,因此当单击按钮时,我将视图更改为PersonView。 我创建PersonViewModel的新实例如下:

 public partial class PersonView : UserControl
    {
        public PersonView()
        {
            PersonViewModel vm = new PersonViewModel();
            InitializeComponent();
            this.DataContext = vm;
        }
    }
Person person = bl.SearchPersonByName("Alex");
changeView(new PersonViewModel(person));
<ResourceDictionary>
<DataTemplate DataType="{x:Type mv:PersonViewModel}">
                <local:PersonView/>
            </DataTemplate>
</ResourceDictionary>
在此视图中,模型
Name
TextBox
控件的变量bindend。我想做的是,如果PersonViewModel是使用构造函数中的
Person
创建的,则将
TextBox
Text
属性设置为传递的人的姓名,将
name
变量设置为与
Person
对象相同,如果不是,
Name
的值将为空,用户可以写入自己的姓名。
现在,当我在构造函数中使用Person对象创建PersonViewModel时,首先使用参数执行构造函数,将
Name
变量设置为与传递的Person对象相同,但之后,它调用无参数构造函数并将
Name
变量设置为null。为什么会发生这种情况?我如何避免这种情况?

正如勒内·沃格特在评论中所建议的,这与PersonViewModel的情况不同。问题是,我在PersonView的代码隐藏中定义了一个没有PersonViewModel参数的新实例作为DataContext,因此当我用PersonViewModel的新实例调用带有Person参数的
changeView
方法时,它首先创建参数实例,然后在显示视图时,由于DataContext被分配给PersonViewModel的一个没有参数的新实例,因此它将覆盖带有Person参数的实例。 我已经在App.xaml文件中定义了PersonViewModel的DataContext,如下所示:

 public partial class PersonView : UserControl
    {
        public PersonView()
        {
            PersonViewModel vm = new PersonViewModel();
            InitializeComponent();
            this.DataContext = vm;
        }
    }
Person person = bl.SearchPersonByName("Alex");
changeView(new PersonViewModel(person));
<ResourceDictionary>
<DataTemplate DataType="{x:Type mv:PersonViewModel}">
                <local:PersonView/>
            </DataTemplate>
</ResourceDictionary>


因此,没有必要在PersonView代码中定义DataContext

请显示创建PersonViewModel实例的代码和XAML部分,以及使用它的位置。如何绑定属性?你到底是如何观察到这种行为的?你调试了吗?因此,您是否确保构造函数为同一个实例运行?因为我认为这是不可能的,如果使用
Person
参数构造对象,则不会执行无参数构造函数。在无参数构造函数上设置断点并检查堆栈跟踪。从那里回溯,看看哪里出错了。请显示您正在使用的代码。例如,如果传递的人员的
Person.Name
为null,则该值将为null,您可能会认为调用了无参数的cunstructor当您在
PersonView
中创建视图模型时,您没有向视图模型传递
Person
。在控件的XAML或代码隐藏中显式设置控件的DataContext甚至不是“不必要的”,实际上是一个编程错误。控件应该从其父元素(例如窗口或页面)继承其DataContext。@Clemens感谢您提供的信息!我是WPF和MVVM的新手,现在很高兴看到这个!谢谢!不知道在PersonView中使用DataTemplate的确切位置。如果它在窗口中,通常可以设置窗口实例的DataContext。一页也一样。然后,您可能有一个ContentControl(或ItemsControl),它使用DataTemplate通过绑定其Content(或ItemsSource)属性来显示单个(或多个)PersonViewModel对象。在这种典型场景中,DataTemplate中元素的DataContext由WPF自动设置。如果显式设置,则会破坏此行为。