gpt4 book ai didi

c# - WPF 用户控件的多个实例都使用相同的 ViewModel

转载 作者:行者123 更新时间:2023-11-30 12:14:16 25 4
gpt4 key购买 nike

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

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

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

这是一些代码。

TabControl.xaml:

<Grid>
<TabControl x:Name="tabControl" ItemsSource="{Binding TabItems}" SelectedIndex="0">
<TabControl.Resources>
<DataTemplate DataType="{x:Type ViewModel:OverviewViewModel}">
<my:OverviewControl />
</DataTemplate>
<DataTemplate DataType="{x:Type ViewModel:MemberViewModel}">
<my:MemberControl />
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemContainerStyle>
<Style TargetType="TabItem">
<Setter Property="Header" Value="{Binding Header}" />
</Style>
</TabControl.ItemContainerStyle>
</TabControl>
</Grid>

TabControl.cs:

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

TabViewModel 有一个包含 TabItems 的 DP:

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

加载到 TabItem 上的 UserControlMemberControl.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;
}

最后,我菜单上的命令实际上将 MemberControl 添加为 TabControl 上的新 TabItem:

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

我在绑定(bind)过程中的某个地方做错了,但如前所述,我找不到它。

感谢您的帮助。

最佳答案

您似乎将每个 MemberControl 的 DataContext 设置了两次。

MemberViewModel 添加到选项卡集合时:

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

这将根据您设置的 DataTemplate 创建一个 MemberControl

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

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

由于第二个 new,我假设您在两个选项卡中都获得了默认值。

关于c# - WPF 用户控件的多个实例都使用相同的 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9909982/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com