none
TabControl中如何实现第一页是A样式,剩余各页全是B样式并通过ItemsSource动态生成 RRS feed

  • 问题

  • 各位大神,我这边要做一个控件,类似WPS,要求通过MVVM模式完成,B样式非常复杂,有没有办法让B样式这样使用

    <TabControl ItemsSource="{Binding Items}"/>



    2019年4月4日 8:47

答案

  • MVVM模式本身就是数据和UI分开的。

    你整体的页面都是在TabControl中展现吧

    你只是第一页和剩余页面不一样呗?

    也就是说第一页的DataTemplate和剩余页DataTemplate不一样。

    只要准备两个模板就可以了呗

    所以TabItemTemplateSelector可以啊

    你绑定的数据是和TabItemTemplateSelector中所选择的DataTemplate所对应的。

    你只要整合数据即可了,然后在TabItemTemplateSelector类中做好模板的选择工作即可了

    ItemSource的数量代表着TabItem的数量,生成集合就好了

    至于复杂度,可以在ItemSource内设置数据类的Model  控件类Model  其他类Model 可以都是集合

    然后是名称[0] [1] [2]获取进行绑定

    或者在每一个小部分的首个控件的添加datacontent

    • 已编辑 ARM830 2019年4月8日 13:01
    • 已标记为答案 shared_ptr 2019年4月9日 6:32
    2019年4月8日 11:20

全部回复

  • TabControl这个控件还是蛮有意思的。

    tabcaotrol显示只是contentcontrol,是每一个TabItem的content。

    你想控制每个页面的样式,或者内容应该是可以的。

    在TabControl的ContentTemplate中编写你想要的页面的内容。

    这个过程你可以使用ContentControl作为你想要的控件的载体。

    对于你想要不同样式,你可以使用ContentTemplateSelector来选择不同的样式模板

    对于标头则是重写

    tabcontrol的ItemTemplate

    对于不同的样式可以使用ItemTemplateSelector来选择不同的样式模板或者ItemContainerStyleSelector来选择不同的style样式

    此时你就可以仅针对ItemSource来编写每个页面的数据集合即可

    参考

    ItemTemplateSelector

    ItemContainerStyleSelector

    ControlTemplateSelector


    如果以上功能还不能满足,那就绑定各个部分的Template,在后台动态生成ContentTemplate和ItemTemplate,

    这个部分使用的是FrameworkElementFactory来创建XAML的控件树在添加到各类模板中。

    这样就可以使用纯C#代码来构建模板代码

    或者使用XamlWriter编写特定部分的xaml代码
    参考

    FrameworkElementFactory

    XamlWriter


    2019年4月4日 11:11
  • 你好大神,你说的这种方法是不是要求Itemsource中绑定的数据一致,只是view不同,类似这种用法:WPF ItemTemplateSelector,我这边是第一页和后面的页所有的东西都不同。

    我这个需求比较的复杂:

    1. 第一页有很多的控件,主要负责展示文件名、下载文件。第二页以后的页的界面更加复杂。

    2. 第二页以后的页面是相同的。

    针对第二页以后的页面我现在想到了几个思路,但是感觉都有问题:

    1. 每次在C#代码中new一个TabItem和一个ViewModel,并将该TabItem的DataContext设置为该ViewModel实例,每一页 使用各自的的ViewModel实例和Model实例,问题是:

        1.1 MVVMLight的Messenger类发送消息的方式类似于命名管道,将来的消息发送可能会有问题。

    1.2 每一页都要有相同的快捷键,快捷键可能也会很难处理。

    1.3 该ViewModel会非常复杂。

    2. 如本问题所示,能通过Itemsource中绑定Model数据,所有的页面共用同一个ViewModel实例,使用不同的Model实例,解决了问题1.1和问题1.2 ,剩余问题是:

        2.1 Itemsource不知道怎么写。

    2.1 该ViewModel会非常复杂。

    3. 每个小控件对应一个ViewModel,所有页面的该控件使用同一个ViewModel实例,使用不同的Model实例,每new一个页面就把所有小控件的Model 各new 一个。这是我编辑答案时刚想到的。。。可能的问题:

    3.1 切换页面时,各个按钮的Can执行函数可能刷新不及时导致界面显得卡顿需要手动RaiseCanExecuteChanged

    3.2 每个小控件的ViewModel都有一个集合用来装该控件各页的Model,不知如何绑定。。。。

    我刚学WPF,不知道能不能麻烦你给提供个思路。






    2019年4月8日 8:34
  • MVVM模式本身就是数据和UI分开的。

    你整体的页面都是在TabControl中展现吧

    你只是第一页和剩余页面不一样呗?

    也就是说第一页的DataTemplate和剩余页DataTemplate不一样。

    只要准备两个模板就可以了呗

    所以TabItemTemplateSelector可以啊

    你绑定的数据是和TabItemTemplateSelector中所选择的DataTemplate所对应的。

    你只要整合数据即可了,然后在TabItemTemplateSelector类中做好模板的选择工作即可了

    ItemSource的数量代表着TabItem的数量,生成集合就好了

    至于复杂度,可以在ItemSource内设置数据类的Model  控件类Model  其他类Model 可以都是集合

    然后是名称[0] [1] [2]获取进行绑定

    或者在每一个小部分的首个控件的添加datacontent

    • 已编辑 ARM830 2019年4月8日 13:01
    • 已标记为答案 shared_ptr 2019年4月9日 6:32
    2019年4月8日 11:20
  • 目前来看也没有别的办法了,就是一个ViewModel感觉得写几千行代码,谢谢大佬
    2019年4月9日 6:32
  • 不是告诉你了嘛  可以添加多个viewmodel啊
    2019年4月9日 13:54