2010-06-28 80 views
6

我想建立一个具有以下结构的MRU菜单:WPF菜单项:将数据绑定项目和静态内容

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

干杯, 弗洛里安

回答

8

与ItemContainerStyle更换的DataTemplate如下:

<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; } 
} 
相关问题