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
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;
}
}
} 重新上传一下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
}
} 我看你实际上在xaml中通过itemtempate 完全重写了ribbon,导致样式基本都没有了。
ribbon的每个tab里面的元素类型很多,这个控件本身没有设计这样的用例。我周一帮你看看是否可能实现。 Richard.Ma 发表于 2024-3-31 00:18
我看你实际上在xaml中通过itemtempate 完全重写了ribbon,导致样式基本都没有了。
ribbon的每个tab里面 ...
好的,谢谢。我又试了下,好像也不支持HierarchicalDataTemplate。最终目的是通过使用类似XML的配置文件,根据配置里的层级关系,自动生产Ribbon菜单,这样可以灵活布置不同用户有哪些功能,以及对应的布局。
内部确认了一下,控件设计的时候确实没有考虑过这样的使用场景。没有办法和grid,chart等数据组件一样进行复杂的数据绑定 Richard.Ma 发表于 2024-4-1 15:27
内部确认了一下,控件设计的时候确实没有考虑过这样的使用场景。没有办法和grid,chart等数据组件一样进行 ...
好吧,那就换个思路了 :mj72:
页:
[1]