2010-06-28 24 views
6

mi piacerebbe costruire un menu MRU che ha la seguente struttura:WPF MenuItem: Mescolare gli elementi databound e contenuti statici

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

Stando MVVM, la mia lista MRU è databound al Modello View. Perché voglio aggiungere il separatore, e non mi piace inserire il separatore e l'azione di cancellazione nella lista degli oggetti, attualmente sto usando un contenitore itemscontrol per il mio menu, ma ho problemi di padding orribili. Avete qualche soluzione che mi permetta di aggiungere solo istanze MenuItem?

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

risposta

8

Sostituire il DataTemplate con un'ItemContainerStyle come segue:

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

Ecco il codice che sto legame a che è simile al tuo codice (ma diverso):

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