Add TabItems to an existing TabControl WPF/MVVM

后端 未结 1 786
眼角桃花
眼角桃花 2021-01-24 09:39

I have TabControl that has already define some TabItems on XAML. I need to create new TabItems and add to it.

If I us

相关标签:
1条回答
  • 2021-01-24 09:59

    What you are doing here is NOT MvvM. Idea behind it is to keep parts of the app separate, i.e. Model should NOT return any UI elements. If you want to use this with any other UI framework for example WinForms then it will fail and will require additional work.
    What you need is something like this, bear in mind that this is an example and you will need to modify this to comply with your requirements.
    Model class:

    namespace Model
    {
        public class Profile
        {
            public string Name { get; set; }
    
            public static int I { get; set; } = 2;
        }
    }  
    

    After this you will need the ViewModel:

    namespace VM
    {
        public class MainViewModel : BaseViewModel
        {
            public MainViewModel()
            {
                ProfilesCollection = new List<Profile>();
                for (int i = 0; i < 100; i++)
                {
                    ProfilesCollection.Add(new Profile() {Name = $"Name {i}"});
                }
            }
    
            private List<Profile> profilesCollection;   
    
            public List<Profile> ProfilesCollection
            {
                get { return profilesCollection; }
                set { profilesCollection = value; OnPropertyChanged(); }
            }
        }
    }  
    

    Now we have base to work with. After that I assume you know how to add the relevant references in your xaml, but this might be seen by other people so I will include it anyway.
    Here is a complete MainWindow.xaml:

    <Window x:Class="SO_app.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:vm="clr-namespace:VM;assembly=VM"
        xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
        xmlns:converter="clr-namespace:SO_app.Converters"
        xmlns:validation="clr-namespace:SO_app.Validation"
        xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
        xmlns:local="clr-namespace:SO_app"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        xmlns:model="clr-namespace:Model;assembly=Model"//reference to my model
        mc:Ignorable="d"
        Title="MainWindow" Height="452.762" Width="525" Closing="Window_Closing">
    <!-- d:DataContext="{d:DesignInstance Type=vm:MainViewModel, IsDesignTimeCreatable=True}" -->
    <Window.Resources>
        <CollectionViewSource Source="{Binding ProfilesCollection}" x:Key="profiles"/> // this corresponds to our collection in VM
    </Window.Resources>
    <Window.DataContext>
        <vm:MainViewModel/>//Data Context of the Window
    </Window.DataContext>
    
    <Window.Background>
        <VisualBrush>
            <VisualBrush.Visual>
                <Rectangle Width="50" Height="50" Fill="ForestGreen"></Rectangle>
            </VisualBrush.Visual>
        </VisualBrush>
    </Window.Background>
    <TabControl>
        <TabControl.Resources>
            <DataTemplate DataType="{x:Type model:Profile}">//this data template will be used by the TabControl
                <Grid>
                    <TextBlock Text="{Binding Name}"/>
                </Grid>
            </DataTemplate>
        </TabControl.Resources>
        <TabControl.ItemsSource>
            <CompositeCollection>
                <TabItem Header="First Item"/>
                <TabItem Header="SecondItem"/>
                <CollectionContainer Collection="{Binding Source={StaticResource profiles}}"/>
            </CompositeCollection>
        </TabControl.ItemsSource>
    </TabControl>
    


    If you want to add more items then just use Command which would be implemented in VM and just add profile to it and enjoy the show.

    0 讨论(0)
提交回复
热议问题