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
。