WPF MenuItem: Смешайте связанные с данными объекты и статическое содержание

Я хотел бы создать меню 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 />

С наилучшими пожеланиями, Florian

6
задан Florian Doyon 28 June 2010 в 15:25
поделиться

1 ответ

Замените 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; }
}
8
ответ дан 16 December 2019 в 21:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: