2013-01-23 34 views
17

Tôi đang ràng buộc ItemsSource của MenuItem của tôi với một ObservableCollection trong ViewModel của tôi. Dưới đây là XAML của tôi:Làm cách nào để liên kết động và thêm tĩnh MenuItem?

<MenuItem Header="_View" 
      ItemsSource="{Binding Windows}"> 
    <MenuItem.ItemContainerStyle> 
    <Style> 
     <Setter Property="MenuItem.Header" 
       Value="{Binding Title}" /> 
    </Style> 
    </MenuItem.ItemContainerStyle> 
</MenuItem> 

phần này hoạt động tuyệt vời, nhưng bây giờ tôi cũng muốn thêm một số MenuItems tĩnh với cùng Xem MenuItem, cách nhau bằng một dấu phân cách. Một cái gì đó như thế này, mặc dù tôi biết điều này sẽ không làm việc vì tôi không thể thiết lập các mục hai lần.

<MenuItem Header="_View" 
      ItemsSource="{Binding Windows}"> 
    <MenuItem.ItemContainerStyle> 
    <Style> 
     <Setter Property="MenuItem.Header" 
       Value="{Binding Title}" /> 
    </Style> 
    </MenuItem.ItemContainerStyle> 
    <Separator /> 
    <MenuItem Header="item 1" /> 
    <MenuItem Header="item 2" /> 
</MenuItem> 

Để bây giờ tôi đã tạo ra một công trình xung quanh bằng cách thêm một tầm cao mới với MenuItem như thế này:

<MenuItem Header="_View"> 
    <MenuItem Header="Windows" 
      ItemsSource="{Binding Windows}"> 
    <MenuItem.ItemContainerStyle> 
     <Style> 
     <Setter Property="MenuItem.Header" 
       Value="{Binding Title}" /> 
     </Style> 
    </MenuItem.ItemContainerStyle> 
    </MenuItem> 
    <MenuItem Header="Load Layout" /> 
    <MenuItem Header="Save Layout" /> 
</MenuItem> 

này hoạt động tốt, nhưng tôi không muốn có một trình đơn phụ nếu có thể . Oh, và tôi cũng thích làm điều này trong xaml thay vì mã phía sau. Bất kỳ ý tưởng?

+0

lẽ bạn có thể sử dụng CompositeCollection để "thống nhất" của bạn bộ sưu tập từ máy ảo với bộ sưu tập XAML đã định nghĩa của bạn. –

Trả lời

35

Bạn có thể sử dụng CompositeCollection để thực hiện việc này, bạn có thể kết hợp các Bộ sưu tập khác nhau và thêm các mục tĩnh trong xaml.

Ví dụ:

XAML:

<Window x:Class="WpfApplication8.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="233" Width="143" Name="UI"> 
    <Window.Resources> 
     <CollectionViewSource Source="{Binding ElementName=UI, Path=Windows}" x:Key="YourMenuItems"/> 
    </Window.Resources> 

    <Grid DataContext="{Binding ElementName=UI}"> 
     <Menu Height="24" VerticalAlignment="Top"> 
     <MenuItem Header="_View" > 
       <MenuItem Header="Windows"> 
        <MenuItem.ItemsSource> 
         <CompositeCollection> 
          <CollectionContainer Collection="{Binding Source={StaticResource YourMenuItems}}" /> 
          <MenuItem Header="Menu Item 1" /> 
          <MenuItem Header="Menu Item 2" /> 
          <MenuItem Header="Menu Item 3" /> 
         </CompositeCollection> 
        </MenuItem.ItemsSource> 
        <MenuItem.ItemContainerStyle> 
         <Style> 
          <Setter Property="MenuItem.Header" Value="{Binding Title}"/> 
         </Style> 
        </MenuItem.ItemContainerStyle> 
       </MenuItem> 
      </MenuItem> 
     </Menu> 
    </Grid> 
</Window> 

public partial class MainWindow : Window 
{ 
    private ObservableCollection<MyObject> _windows = new ObservableCollection<MyObject>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
     Windows.Add(new MyObject { Title = "Collection Item 1" }); 
     Windows.Add(new MyObject { Title = "Collection Item 2" }); 
    } 

    public ObservableCollection<MyObject> Windows 
    { 
     get { return _windows; } 
     set { _windows = value; } 
    } 
} 

public class MyObject 
{ 
    public string Title { get; set; } 
} 

Kết quả:

enter image description here

+0

Công cụ '{Binding ElementName = UI}' là gì? – Pyritie

+0

nếu tôi liên kết dữ liệu 'Menu' ItemsSource (không phải một trong các MenuItems của nó) thì sao? Tôi không thể nhận được 'ItemContainerStyle' để làm việc, bởi vì tôi đặt' Menu.ItemContainerStyle' và đó là sai ... – JobaDiniz