代码之家  ›  专栏  ›  技术社区  ›  Florian Doyon

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

  •  6
  • Florian Doyon  · 技术社区  · 16 年前

    我想建立一个具有以下结构的MRU菜单:

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

    这是MVVM,我的mru列表被数据绑定到视图模型。因为我想添加分隔符,并且我不想在项目列表中插入分隔符和清除条目操作,所以我当前正在使用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 回复  |  直到 16 年前
        1
  •  8
  •   Zamboni    16 年前

    <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; }
    }
    
    推荐文章