2010-06-28 13 views
6

Ich mag würde ein MRU-Menü erstellen, die die folgende Struktur aufweist:WPF MenuItem: Mix Databound-Elemente und statische Inhalte

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

Da dies MVVM, meine MRU-Liste wird auf die Ansicht Modell datengebundene. Da ich das Trennzeichen hinzufügen möchte und ich das Trennzeichen und die Aktion zum Löschen von Einträgen nicht in die Liste der Elemente einfügen möchte, verwende ich momentan einen itemscontrol-Container für mein Menü, aber ich habe schreckliche Padding-Probleme. Haben Sie eine Lösung, die es mir erlaubt, einfach MenuItem Instanzen hinzuzufügen?

Hier ist der 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 /> 

Cheers, Florian

Antwort

8

die Datatemplate mit einem ItemContainerStyle Ersetzen Sie wie folgt vor:

<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> 

Hier ist der Code, den ich verbindlich bin darauf ist ähnlich zu Ihrem Code (aber anders):

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; } 
} 
Verwandte Themen