WPF菜单项:混合数据绑定项和静态内容

8
我希望构建一个具有以下结构的MRU菜单:

最近使用:

File
+=>Recent Files
   +=> Doc1.txt
   +=> Doc2.txt
   -separator-
   +=> Clear entries

作为MVVM模式下的一部分,我的最近使用列表与视图模型进行数据绑定。由于我想要添加分隔符,但我不想在项目列表中插入分隔符和清除条目操作,所以我目前正在使用itemscontrol容器来管理菜单,但我遇到了可怕的填充问题。你有什么解决方案可以让我只添加MenuItem实例吗?
以下是XAML代码:
<!-- MRU list -->
<MenuItem Header="_Recent Files" >

    <ItemsControl ItemsSource="{Binding MostRecentlyUsed.Entries,Mode=OneWay}">
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <MenuItem Header="{Binding ShortName}" ToolTip="{Binding FileName}" Command="{Binding OpenCommand}"/>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
    </ItemsControl>
    <Separator />
    <MenuItem Header="_Clean Entries" Command="{Binding MostRecentlyUsed.CleanCommand}" />
</MenuItem>
<Separator />

欢呼, 弗洛里安
1个回答

9
将DataTemplate替换为以下ItemContainerStyle:
<MenuItem Header="_Recent Files" ItemsSource="{Binding Commands,Mode=OneWay}">
  <MenuItem.ItemContainerStyle>
    <Style TargetType="{x:Type MenuItem}">
       <Setter Property="Header" Value="{Binding Path=ShortName}" />
       <Setter Property="ToolTip" Value="{Binding Path=FileName}" />
       <Setter Property="Command" Value="{Binding Path=OpenCommand}" />
       <Setter Property="CommandParameter" Value="{Binding Path=OpenParameter}" />
       <Style.Triggers>
         <DataTrigger Binding="{Binding Path=IsSeparator}" Value="true">
           <Setter Property="MenuItem.Template">
             <Setter.Value>
               <ControlTemplate TargetType="{x:Type MenuItem}">
                 <Separator Style="{DynamicResource {x:Static MenuItem.SeparatorStyleKey}}"/>
               </ControlTemplate>
             </Setter.Value>
           </Setter>
         </DataTrigger>
       </Style.Triggers>
     </Style>
   </MenuItem.ItemContainerStyle>
 </MenuItem>

这是我要绑定的代码,与你的代码类似(但不同):

public class MainViewModel : ViewModelBase
{
  public MainViewModel()
  {
     GoCommand = new DelegateCommand<object>(OnGoCommand, CanGoCommand);
     LoadCommands();
  }

  private List<MyCommand> _commands = new List<MyCommand>();
  public List<MyCommand> Commands
  {
     get { return _commands; }
  }

  private void LoadCommands()
  {
     MyCommand c1 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "1", ShortName = "Doc1", FileName = "Doc1.txt", IsSeparator = false };
     MyCommand c2 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "2", ShortName = "Doc2", FileName = "Doc1.txt", IsSeparator = false };
     MyCommand c3 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "4", ShortName = "", FileName = "", IsSeparator = true };
     MyCommand c4 = new MyCommand { OpenCommand = GoCommand, OpenParameter = "5", ShortName = "_Clean Entries", FileName = "Clean Entries", IsSeparator = false };
     _commands.Add(c1);
     _commands.Add(c2);
     _commands.Add(c3);
     _commands.Add(c4);
  }

  public ICommand GoCommand { get; private set; }
  private void OnGoCommand(object obj)
  {
  }

  private bool CanGoCommand(object obj)
  {
     return true;
  }
}


public class MyCommand
{
  public ICommand OpenCommand { get; set; }
  public string ShortName { get; set; }
  public string FileName { get; set; }
  public string OpenParameter { get; set; }
  public bool IsSeparator { get; set; }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接