2010-06-28 3 views
6

Je voudrais construire un menu MRU qui a la structure suivante:WPF MenuItem: Mélanger les éléments databound et le contenu statique

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

Cela étant MVVM, ma liste de MRU est DataBound à la vue du modèle. Parce que je veux ajouter le séparateur, et je n'ai pas envie d'insérer le séparateur et l'action d'entrée libre dans la liste des éléments, j'utilise actuellement un conteneur itemscontrol pour mon menu, mais j'ai d'horribles problèmes de remplissage. Avez-vous une solution qui me permettrait d'ajouter simplement MenuItem instances?

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

Répondre

8

Remplacer le DataTemplate avec un ItemContainerStyle comme suit:

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

Voici le code que je suis se liant à qui est semblable à votre code (mais différent):

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