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 (将#修改为@)