2013-01-23 47 views
17

मैं अपने मेनूमेट के आइटम्ससोर्स को अपने व्यू मॉडेल में एक अवलोकन करने योग्य चयन में बाध्य कर रहा हूं।मैं मेनूइटम को गतिशील रूप से बाध्य और स्थिर रूप से कैसे जोड़ूं?

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

इस भाग अच्छा काम करता है, लेकिन अब मैं भी एक ही दृश्य MenuItem करने के लिए कुछ स्थिर MenuItems, एक विभाजक के साथ अलग जोड़ना चाहते हैं: यहाँ मेरी XAML है। ऐसा कुछ, भले ही मुझे पता है कि यह काम नहीं करेगा क्योंकि मैं वस्तुओं को दो बार सेट नहीं कर सकता।

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

अभी के लिए मैं इस तरह MenuItem के लिए एक और स्तर को जोड़कर एक काम बनाया है चारों ओर:

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

यह ठीक काम करता है, लेकिन मैं नहीं बल्कि पर यदि सभी संभव एक उप मेनू की जरूरत नहीं होगी । ओह, और मैं इसे पीछे कोड के बजाय xaml में भी करना पसंद करूंगा। कोई विचार?

+0

शायद तुम CompositeCollection उपयोग कर सकते हैं "एकजुट" करने के लिए अपने आपके एक्सएएमएल परिभाषित संग्रह के साथ वीएम से संग्रह। –

उत्तर

35

ऐसा करने के लिए आप CompositeCollection का उपयोग कर सकते हैं, आप विभिन्न संग्रहों को जोड़ सकते हैं और xaml में स्थिर आइटम जोड़ सकते हैं।

उदाहरण:

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

परिणाम:

enter image description here

+0

'{बाध्यकारी ElementName = UI}' सामान क्या है? – Pyritie

+0

क्या होगा यदि मैं डेटा 'बाध्यकारी' मेनू 'आइटम्स स्रोत (इसके मेनू आइटम्स में से कोई नहीं) हूं? मुझे 'ItemContainerStyle' काम करने के लिए नहीं मिला, क्योंकि मैंने' menu.ItemContainerStyle' सेट किया है और यह गलत है ... – JobaDiniz