如何解决C# TabControl WPF MVVM 相同用户控件的新实例
我在 Wpf MVVM 应用程序中实现了 tabcontrol,选项卡系统显示了一个用户控件,但不是创建用户控件的新实例,所有选项卡都包含相同的用户控件,并且单个选项卡上的更改复制到我的其他选项卡中打开。 有没有办法在每个新选项卡上创建相同用户控件或视图模型的新实例? 我已经检查了许多其他类似的问题,但找不到与我类似的情况。
这是代码:
**ITab.cs**
namespace CommercialClient.src.Tab
{
public interface ITab
{
string Name { get; set; }
ICommand CloseCommand { get; }
event EventHandler CloseRequested;
}
public abstract class Tab : ITab
{
public Tab()
{
CloseCommand = new ActionCommand(p => CloseRequested?.Invoke(this,EventArgs.Empty));
}
public string Name { get; set; }
public ICommand CloseCommand { get; }
public event EventHandler CloseRequested;
}
}
**NaMetab.cs**
namespace CommercialClient.src.Tab
{
public class NaMetab : Tab
{
public MainUserControlviewmodel dt { get; set; }
public NaMetab()
{
Name = "CommercialTab";
dt = new MainUserControlviewmodel();
}
}
}
**NaMetabView.xaml**
<UserControl x:Class="CommercialClient.src.Tab.NaMetabView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CommercialClient.src.Tab" xmlns:CommercialClient ="clr-namespace:CommercialClient.src"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800" Name="MM">
<Grid>
<CommercialClient:MainUserControl DataContext="{Binding DataContext.dt,ElementName=MM}" />
</Grid>
</UserControl>
**NaMetabView.xaml.cs**
namespace CommercialClient.src.Tab
{
/// <summary>
/// Interaction logic for NaMetabView.xaml
/// </summary>
public partial class NaMetabView : UserControl
{
public NaMetabView()
{
InitializeComponent();
DataContext = new NaMetab();
}
}
}
**TabMainWindows.xaml**
<UserControl x:Class="CommercialClient.src.Tab.TabMainWindows"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CommercialClient.src.Tab" xmlns:login="clr-namespace:VirtualLogicCommon.UserManage.Login;assembly=VirtualLogicCommon"
xmlns:tabss="clr-namespace:CommercialClient.src"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
Name="TUC"
>
<!--<UserControl.DataContext>
<local:TabMainWindowviewmodel/>
</UserControl.DataContext>-->
<DockPanel >
<StackPanel DockPanel.Dock="Top" Orientation="Horizontal">
<Button Command="{Binding DataContext.NewTabCommand,ElementName=TUC}" Margin="5">+</Button>
</StackPanel>
<TabControl ItemsSource="{Binding DataContext.Tabs,ElementName=TUC}" IsSynchronizedWithCurrentItem="True">
<TabControl.Resources>
<DataTemplate DataType="{x:Type local:NaMetab}" >
<local:NaMetabView/>
</DataTemplate>
</TabControl.Resources>
<TabControl.ItemTemplate>
<DataTemplate DataType="{x:Type local:ITab}">
<TextBlock>
<Run Text="{Binding Name}"/>
<Hyperlink Command="{Binding CloseCommand}">X</Hyperlink>
</TextBlock>
</DataTemplate>
</TabControl.ItemTemplate>
</TabControl>
</DockPanel>
</UserControl>
**TabMainWindows.xaml.cs**
namespace CommercialClient.src.Tab
{
/// <summary>
/// Interaction logic for UserControl1.xaml
/// </summary>
public partial class TabMainWindows : UserControl
{
public TabMainWindows()
{
InitializeComponent();
DataContext = new TabMainWindowviewmodel();
}
}
}
**TabMainWindowsviewmodel.cs**
namespace CommercialClient.src.Tab
{
public class TabMainWindowviewmodel : Baseviewmodel
{
private readonly ObservableCollection<ITab> tabs;
public TabMainWindowviewmodel(): base("Tabs")
{
NewTabCommand = new ActionCommand(p => NewTab());
tabs = new ObservableCollection<ITab>();
tabs.CollectionChanged += Tabs_CollectionChanged;
Tabs = tabs;
}
public ICommand NewTabCommand { get; }
public ICollection<ITab> Tabs { get; }
private void NewTab()
{
Tabs.Add(new NaMetab());
NotifyPropertyChanged(nameof(Tabs));
}
private void Tabs_CollectionChanged(object sender,NotifyCollectionChangedEventArgs e)
{
ITab tab;
switch (e.Action)
{
case NotifyCollectionChangedAction.Add:
tab = (ITab)e.NewItems[0];
tab.CloseRequested += OnTabCloseRequested;
break;
case NotifyCollectionChangedAction.Remove:
tab = (ITab)e.OldItems[0];
tab.CloseRequested -= OnTabCloseRequested;
break;
}
}
private void OnTabCloseRequested(object sender,EventArgs e)
{
Tabs.Remove((ITab) sender);
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。