Maxxx 发表于 2024-3-29 14:45:44

WPF C1Ribbon如何通过MVVM模式自动生成菜单?

本帖最后由 Maxxx 于 2024-3-29 14:46 编辑

已知通过XAML可以绘制Ribbon,以下是通过XAML实现的效果

      <c1:C1Ribbon x:Name="C1RibbonAuto" Grid.Row="1" SelectedIndex="0" Background="LightBlue">
如果使用MVVM模式,如何使用通过ViewModel自动生成菜单?下面这种定义方式,TabItem,Group,Button分别定义一个Model,然后重新设计C1Ribon的模板?
<blockquote>class MenuViewModel

Maxxx 发表于 2024-3-29 14:48:28

class MenuViewModel
{
    public string Header { get; set; }
    public ObservableCollection<TabItemModel> TabItems { get; set; } = new ObservableCollection<TabItemModel>();

    public MenuViewModel2()
    {
      var btn1 = new ButtonModel("btn11");
      var btn2 = new ButtonModel("btn22");
      var btn3 = new ButtonModel("btn33");

      var group = new GroupModel("Group1");
      group.ButtonModels.Add(btn1);
      group.ButtonModels.Add(btn2);
      group.ButtonModels.Add(btn3);

      var tab = new TabItemModel("Tab1111");
      TabItems.Add(tab);
    }

    public class TabItemModel
    {
      public ObservableCollection<GroupModel> GroupModels { get; set; } = new ObservableCollection<GroupModel>();

      public string Header { get; set; }

      public TabItemModel(string name)
      {
            Header = name;
      }
    }

    public class GroupModel
    {
      public ObservableCollection<ButtonModel> ButtonModels { get; set; } = new ObservableCollection<ButtonModel>();
      public string Header { get; set; }
      public GroupModel(string name)
      {
            Header = name;
      }
    }

    public class ButtonModel
    {
      public string Name { get; set; }

      public ButtonModel(string name)
      {
            Name = name;
      }
    }
}

Maxxx 发表于 2024-3-29 15:09:33

重新上传一下ViewModel和View的代码,显示有问题:
<c1:C1Ribbon Grid.Row="0" x:Name="MyRibbon" Background="LightGoldenrodYellow"
            ItemsSource="{Binding Tabs}" SelectedIndex="0">
    <c1:C1Ribbon.ItemTemplate>
      <DataTemplate>
            <c1:RibbonTabItem Header="{Binding Header}">
                <c1:RibbonTabItem.ContentTemplate>
                  <DataTemplate>
                        <ItemsControl ItemsSource="{Binding Groups}">
                            <ItemsControl.ItemTemplate>
                              <DataTemplate>
                                    <c1:RibbonGroup Header="{Binding Header}">
                                        <ItemsControl ItemsSource="{Binding Buttons}">
                                          <ItemsControl.ItemTemplate>
                                                <DataTemplate>
                                                    <c1:C1ButtonTool Label="{Binding Label}"/>
                                                </DataTemplate>
                                          </ItemsControl.ItemTemplate>
                                        </ItemsControl>
                                    </c1:RibbonGroup>
                              </DataTemplate>
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                  </DataTemplate>
                </c1:RibbonTabItem.ContentTemplate>
            </c1:RibbonTabItem>
      </DataTemplate>
    </c1:C1Ribbon.ItemTemplate>
</c1:C1Ribbon>

public class RibbonViewModel
{
    public ObservableCollection<RibbonTabViewModel> Tabs { get; set; } = new ObservableCollection<RibbonTabViewModel>();

    public RibbonViewModel()
    {
      // Initialize tabs
      Tabs.Add(new RibbonTabViewModel("Tab1"));
      Tabs.Add(new RibbonTabViewModel("Tab2"));
      // Add more tabs if needed
    }
}

public class RibbonTabViewModel
{
    public string Header { get; set; }
    public ObservableCollection<RibbonGroupViewModel> Groups { get; set; } = new ObservableCollection<RibbonGroupViewModel>();

    public RibbonTabViewModel(string header)
    {
      Header = header;
      // Initialize groups
      Groups.Add(new RibbonGroupViewModel("Group1"));
      Groups.Add(new RibbonGroupViewModel("Group2"));
      // Add more groups if needed
    }
}

public class RibbonGroupViewModel
{
    public string Header { get; set; }
    public ObservableCollection<ButtonViewModel> Buttons { get; set; } = new ObservableCollection<ButtonViewModel>();

    public RibbonGroupViewModel(string header)
    {
      Header = header;
      // Initialize buttons
      Buttons.Add(new ButtonViewModel("Button 1"));
      Buttons.Add(new ButtonViewModel("Button 2"));
      Buttons.Add(new ButtonViewModel("Button 3"));
      Buttons.Add(new ButtonViewModel("Button 4"));
      // Add more buttons if needed
    }
}

public class ButtonViewModel
{
    public string Label { get; set; }
    public ICommand Command { get; set; }

    public ButtonViewModel(string label)
    {
      Label = label;
      // Initialize command if needed
    }
}

Maxxx 发表于 2024-3-29 15:11:02

Richard.Ma 发表于 2024-3-31 00:18:14

我看你实际上在xaml中通过itemtempate 完全重写了ribbon,导致样式基本都没有了。

ribbon的每个tab里面的元素类型很多,这个控件本身没有设计这样的用例。我周一帮你看看是否可能实现。

Maxxx 发表于 2024-3-31 11:25:27

Richard.Ma 发表于 2024-3-31 00:18
我看你实际上在xaml中通过itemtempate 完全重写了ribbon,导致样式基本都没有了。

ribbon的每个tab里面 ...

好的,谢谢。我又试了下,好像也不支持HierarchicalDataTemplate。最终目的是通过使用类似XML的配置文件,根据配置里的层级关系,自动生产Ribbon菜单,这样可以灵活布置不同用户有哪些功能,以及对应的布局。

Richard.Ma 发表于 2024-4-1 15:27:09

内部确认了一下,控件设计的时候确实没有考虑过这样的使用场景。没有办法和grid,chart等数据组件一样进行复杂的数据绑定

Maxxx 发表于 2024-4-1 15:52:25

Richard.Ma 发表于 2024-4-1 15:27
内部确认了一下,控件设计的时候确实没有考虑过这样的使用场景。没有办法和grid,chart等数据组件一样进行 ...

好吧,那就换个思路了

Richard.Ma 发表于 2024-4-1 15:59:30

:mj72:
页: [1]
查看完整版本: WPF C1Ribbon如何通过MVVM模式自动生成菜单?