C# 在MahApps.Metro中使用数据绑定项控件时显示WindowCommand的分隔符
手动添加按钮作为窗口命令时,分隔符通常显示:C# 在MahApps.Metro中使用数据绑定项控件时显示WindowCommand的分隔符,c#,wpf,xaml,data-binding,mahapps.metro,C#,Wpf,Xaml,Data Binding,Mahapps.metro,手动添加按钮作为窗口命令时,分隔符通常显示: <controls:MetroWindow.RightWindowCommands> <controls:WindowCommands ShowSeparators="True"> <Button Content="Button1" /> <Button Content="Button2" /> </controls:WindowCommands&g
<controls:MetroWindow.RightWindowCommands>
<controls:WindowCommands ShowSeparators="True">
<Button Content="Button1" />
<Button Content="Button2" />
</controls:WindowCommands>
</controls:MetroWindow.RightWindowCommands>
我想你已经注意到了这个问题,但没有意识到
WindowCommands
本身就是一个ItemsControl
控件,所以只要给它一个ItemsSource
,它就会被排序
关键的事情是为它提供WindowCommandsItem
,而不是您的viewmodel(这真的感觉像是0.13 alpha系列中的一个bug,我在那里测试过,因为如果内存可用,它过去在没有这种特殊转换的情况下工作。)
以下是我测试的代码片段:
XAML位:
结果:
关于@Maverik answer,不需要使用转换器。只需将
DataTemplate
放在WindowCommands.ItemTemplate
上即可
<controls:MetroWindow.RightWindowCommands>
<controls:WindowCommands ItemsSource="{Binding Commands}">
<controls:WindowCommands.ItemTemplate>
<DataTemplate DataType="{x:Type local:Model}">
<Button Content="{Binding Name}" />
</DataTemplate>
</controls:WindowCommands.ItemTemplate>
</controls:WindowCommands>
</controls:MetroWindow.RightWindowCommands>
至于“为什么”,我在XAML中现有控件的下方添加了另一个ItemsControl,并在这两个ItemsControl之间放置了一个分隔符,因此它本质上将每个ItemsControl视为控件集合中的一个控件。如果有人对XAML解决方案有任何想法,我将不胜感激。非常有魅力,谢谢!我唯一改变的是让转换器返回一组按钮,而不是WindowCommandItems,但这两个按钮都可以工作。哦,我更喜欢使用WindowCommandItems,因为这样我就可以让模型的数据模板在应用程序的其余部分处理它们时工作。返回按钮将限制您仅使用按钮样式。我尝试了此解决方案和多种变体,但无法使其正常工作。什么也没发生。我尝试使用转换器进行调试,但转换器代码没有命中,因此我假设必须在数据模板中的某个位置重新设置数据上下文。
foreach (Game game in ((MainViewModel)DataContext).GamesViewModel.Games)
WindowCommands.Items.Add(new Button { Content = game.Name });
<controls:MetroWindow.DataContext>
<wpfApplication1:ViewModel />
</controls:MetroWindow.DataContext>
<controls:MetroWindow.Resources>
<DataTemplate DataType="{x:Type wpfApplication1:Model}">
<Button Content="{Binding Name}" />
</DataTemplate>
<wpfApplication1:ModelToWindowCommandsItemConverter x:Key="Converter" />
</controls:MetroWindow.Resources>
<controls:MetroWindow.RightWindowCommands>
<controls:WindowCommands ItemsSource="{Binding Commands, Converter={StaticResource Converter}}" />
</controls:MetroWindow.RightWindowCommands>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{ return ((IEnumerable<Model>)value).Select(x => new WindowCommandsItem { Content = x }); }
public class ViewModel
{
public ObservableCollection<Model> Commands { get; } = new ObservableCollection<Model>
{
new Model { Name = "Skyrim" },
new Model { Name = "Fallout 4" },
new Model { Name = "Fallout NV" }
};
}
public class Model
{
public string Name { get; set; }
}
<controls:MetroWindow.RightWindowCommands>
<controls:WindowCommands ItemsSource="{Binding Commands}">
<controls:WindowCommands.ItemTemplate>
<DataTemplate DataType="{x:Type local:Model}">
<Button Content="{Binding Name}" />
</DataTemplate>
</controls:WindowCommands.ItemTemplate>
</controls:WindowCommands>
</controls:MetroWindow.RightWindowCommands>