wpf用户控件的多个实例都使用相同的viewmodel

我有一个应用程序,当我单击一个按钮加载一个带有usercontrol的新tabitem。 这工作正常,但是……当我再次单击“添加”按钮时,会添加另一个tabitem以及usercontrol的新实例。 这就是问题所在。 当我在tab1中添加一些数据并切换到tab2时,我也看到了输入的数据。 这怎么可能? 我为每个usercontrol使用了一个新的viewmodel,因此tab1和tab2上的usercontrols如何显示相同的数据。 它可能是一些愚蠢的东西,但我找不到它……

结构是这样的:MainWindow加载一个UserControl只有一个tabcontrol。 单击菜单中的“添加”按钮后,将添加一个新的tabitem,并在其上添加新的usercontrol。

这里有一些问题看起来像这样但是不同的..

这是一些代码。

TabControl.xaml:

                 

TabControl.cs

 public TabControl() { InitializeComponent(); this.DataContext = new TabViewModel(true); } 

TabViewModel有一个包含tabitems的DP:

  public static readonly DependencyProperty TabItemsProperty = DependencyProperty.Register("TabItems", typeof(ObservableCollection), typeof(TabViewModel), new UIPropertyMetadata(new ObservableCollection())); public ObservableCollection TabItems { get { return (ObservableCollection)GetValue(TabItemsProperty); } set { SetValue(TabItemsProperty, value); } } 

在tabitem上加载的usercontrol,MemberControl.cs

 public MemberControl() { InitializeComponent(); this.DataContext = new MemberViewModel{}; } 

MemberControlViewModel:

  private MemberModel _memberModel = new MemberModel(); public MemberViewModel() { Address = new AddressViewModel(); } public static readonly DependencyProperty FirstNameProperty = DependencyProperty.Register("FirstName", typeof(string), typeof(MemberViewModel), new UIPropertyMetadata(string.Empty, OnFirstNameChanged)); public string FirstName { get { return (string)GetValue(FirstNameProperty); } set { SetValue(FirstNameProperty, value); } } public static void OnFirstNameChanged(DependencyObject m, DependencyPropertyChangedEventArgs e) { var d = m as MemberViewModel; if (d._memberModel != null) d._memberModel.FirstName = d.FirstName; } public static readonly DependencyProperty LastNameProperty = DependencyProperty.Register("LastName", typeof(string), typeof(MemberViewModel), new UIPropertyMetadata(string.Empty, OnLastNameChanged)); public string LastName { get { return (string)GetValue(LastNameProperty); } set { SetValue(LastNameProperty, value); } } public static void OnLastNameChanged(DependencyObject m, DependencyPropertyChangedEventArgs e) { var d = m as MemberViewModel; if (d._memberModel != null) d._memberModel.LastName = d.LastName; } etc... 

最后,我的菜单上的命令实际上将membercontrol添加为tabcontrol上的新tabitem:

  private void LoadNewMember(object notUsed) { _tabViewModel.TabItems.Add(new MemberViewModel { Header = "New Member" }); _addOverview.RaiseCanExecuteChanged(); } 

有些人一路上我做错了绑定,但正如所说,我找不到它..

感谢任何帮助。

您似乎正在为每个MemberControl两次DataContext。

MemberViewModel添加到选项卡集合后:

 _tabViewModel.TabItems.Add(new MemberViewModel { Header = "New Member" }); 

这将创建一个MemberControl因为您已经设置了DataTemplate。

然后,在MemberControl的构造函数中,然后将DataContext重置为MemberViewModel的新实例:

 public MemberControl() { InitializeComponent(); this.DataContext = new MemberViewModel{}; } 

我假设您在两个选项卡中都获得了默认值,因为这是第二个new