为什么在调用带参数的构造函数之后调用无参数构造函数,删除我在C#MVVM中的更改?
我正在使用WPF创建一个桌面应用程序和MVVM,没有任何框架作为体系结构。在XAML中,我有一个绑定了PersonViewModel名称变量的文本框:为什么在调用带参数的构造函数之后调用无参数构造函数,删除我在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
<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自动设置。如果显式设置,则会破坏此行为。