以编程方式将新的Datagrid(或其他UserControll)添加到以编程方式生成的TabItem中(使用mvvm)

时间:2017-08-04 09:57:48

标签: c# wpf xaml mvvm

我有一个带有TabControl的XAML代码,其中包含2个选项卡(选项卡A和选项卡B)。在选项卡A中,我可以对选项卡B进行配置,因此选项卡B可以依赖于选项卡A动态更改。选项卡B包含一个静态Tabcontroll,不会实现任何选项卡(稍后将生成选项卡)。注意:“标签A”和“标签B”是主标签,“标签C”,“标签D”等是“标签B”中的子标签。

这是我的XAML代码:

<TabItem Header="TAB_B">
            <Grid>
                <TabControl ItemsSource="{Binding MyTabItems, UpdateSourceTrigger=PropertyChanged}">
                        <TabControl.ItemTemplate>
                            <DataTemplate>
                                <!-- here I want to show a Datagrid for each new Tab ("Tab C", "Tab D", ...) -->
                            </DataTemplate>                            
                        </TabControl.ItemTemplate>
                </TabControl>
            </Grid>
        </TabItem>

在我的ViewModel中,我有绑定属性:

    private ObservableCollection<TabItem> _myTabItems;
    public ObservableCollection<TabItem> MyTabItems
    {
        get { return _myTabItems; }
        set
        {
            _myTabItems = value;
            OnPropertyChanged("MyTabItems");
        }
    }

在我的Viewmodel中,有一个方法可以在Tab B的TabController中构建我的Tab项:

    public void BuildContentOfTabB()
    {
        foreach (var item in myTabList)
        {
                MyTab = new TabItem();
                MyTab.Header = myHeaderString; // e.g. "Tab C", "Tab D"
                MyTabItems.Add(MyTab);
            }
        }
    }

这很有效。我在TabController中获得了新的TabItems(“Tab C”,“Tab D”,...)。现在我想在“Tab C”或“Tab D”中获得类似Datagrid的新UserControl。我不知道如何解决我的问题。谢谢你的回答。

1 个答案:

答案 0 :(得分:0)

为您的viewmodels创建一个基类:

public abstract class BaseVM {}

修改您的MyTabItem媒体资源:

public ObservableCollection<BaseVM> MyTabItems...

创建自定义视图模型继承自BaseVMpublic class DatagridVM:BaseVM
你的tabControl是:

<TabControl ItemsSource="{Binding MyTabItems}">
            <TabControl.ContentTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding}"/>
                </DataTemplate>
            </TabControl.ContentTemplate>
</TabControl>
在ResourceDictionary中

定义viewmodels的视图:

<DataTemplate DataType="{x:Type vm:DatagridVM}">
    <Datagrid/>
</DataTemplate>