代码之家  ›  专栏  ›  技术社区  ›  Strawberryshrub

Wpf使用prism向tabcontrol动态添加更多视图

  •  -4
  • Strawberryshrub  · 技术社区  · 7 年前

    我有两个区域,一个有两个按钮和一个tabcontrol区域。单击按钮1后,我想将3个视图作为选项卡插入tabcontrol。单击按钮2后,我想从按钮1中删除选项卡(但保留数据在后面),并在选项卡控件中再次插入3个视图作为选项卡。接下来是棘手的部分:-),这应该是动态的,button1和button2的3个视图中有2个基于相同的视图/视图模型。

    我很感激我能得到的一切-D

    1 回复  |  直到 7 年前
        1
  •  1
  •   oleg3790    7 年前

    您应该能够使用ViewModel-first方法来完成这项工作。这里有一个快速和肮脏的方法来做到这一点,清理它在您自己的方便。

    视图/视图模型结构:

    视图2-视图模型2:IViewModel

    视图3-视图模型3:IViewModel

    IViewModel需要一个“Content”字符串属性

    <Window x:Class="SFQ1.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:local="clr-namespace:SFQ1"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Window.DataContext>
            <local:MainViewModel/>
        </Window.DataContext>
        <Window.Resources>
            <DataTemplate DataType="{x:Type local:ViewModel1}">
                <local:View1/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:ViewModel2}">
                <local:View2/>
            </DataTemplate>
            <DataTemplate DataType="{x:Type local:ViewModel3}">
                <local:View3/>
            </DataTemplate>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>
            <TabControl Grid.Row="0" ItemsSource="{Binding VmObservable}">
                <TabControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Content}"/>
                    </DataTemplate>
                </TabControl.ItemTemplate>
                <TabControl.ContentTemplate>
                    <DataTemplate>
                        <ContentControl Content="{Binding}">
                        </ContentControl>
                    </DataTemplate>
                </TabControl.ContentTemplate>
            </TabControl>
            <Button Grid.Row="1" Margin="10,0,0,0" Width="100" Content="1" 
                    HorizontalAlignment="Left" Command="{Binding SetOneCommand}"/>
            <Button Grid.Row="1" Margin="130,0,0,0" Width="100" Content="2" 
                    HorizontalAlignment="Left" Command="{Binding SetTwoCommand}"/>
        </Grid>
    </Window>
    

    MainViewModel.cs

    public class MainViewModel : BindableBase
    {
        private readonly List<IViewModel> _viewModelCollection;
    
        private ObservableCollection<IViewModel> _vmObservable;
        public ObservableCollection<IViewModel> VmObservable
        {
            get { return _vmObservable; }
            set
            {
                SetProperty(ref _vmObservable, value);
                RaisePropertyChanged();
            }
        }
    
    
        private IViewModel _activeVm;
        public IViewModel ActiveVm
        {
            get { return _activeVm; }
            set
            {
                SetProperty(ref _activeVm, value);
                RaisePropertyChanged();
            }
        }
    
        public DelegateCommand SetOneCommand { get; set; }
        public DelegateCommand SetTwoCommand { get; set; }
    
        public MainViewModel()
        {
            SetOneCommand = new DelegateCommand(SetOne);
            SetTwoCommand = new DelegateCommand(SetTwo);
            VmObservable = new ObservableCollection<IViewModel>();
    
            _viewModelCollection = new List<IViewModel>()
            {
                new ViewModel1(),
                new ViewModel2(),
                new ViewModel3()
            };
        }
    
        private void SetOne()
        {
            VmObservable.Clear();
            VmObservable.Add(GetViewModel(typeof(ViewModel1)));
            VmObservable.Add(GetViewModel(typeof(ViewModel2)));
            VmObservable.Add(GetViewModel(typeof(ViewModel3)));
        }
    
        private void SetTwo()
        {
            VmObservable.Clear();
            VmObservable.Add(GetViewModel(typeof(ViewModel2)));
            VmObservable.Add(GetViewModel(typeof(ViewModel3)));
        }
    
        private IViewModel GetViewModel( Type viewModelType )
        {
            return _viewModelCollection.Find(x => x.GetType().Equals(viewModelType));
        }
    }