2015-02-10 96 views
0

我試圖創建集合項目的MenuItems - 並失敗。詳細:我有一個簡單的類ClassA,它定義了一個字符串屬性「HeadText」。 在我的MainViewModel中,我定義了一個ObservableCollection屬性。收藏品充滿了3件物品。現在在XAML中,我想創建這3個類型ClassA的MenuItems。我做了以下內容:從集合創建MenuItems

<Window.Resources> 
    <CompositeCollection x:Key="CollA"> 
     <ItemsControl ItemsSource="{Binding Path=MItems}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <MenuItem Header="{Binding HeadText}"/> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </CompositeCollection> 
</Window.Resources> 

<Grid> 
    <Menu DockPanel.Dock="Top" ItemsSource="{Binding Source={StaticResource CollA}}"/> 
</Grid> 

但我得到的是一個空的菜單欄。任何想法我可以做到這一點?

視圖模型和類ClassA的:

public class MainVM 
{ 
    public MainVM() { 
     _mItems.Add(new ClassA() { HeadText = "A" }); 
     _mItems.Add(new ClassA() { HeadText = "B" }); 
     _mItems.Add(new ClassA() { HeadText = "C" }); 
    } 

    private ObservableCollection<ClassA> _mItems = new ObservableCollection<ClassA>(); 
    public ObservableCollection<ClassA> MItems{ 
     get { return _mItems; } 
    } 
} 

public class ClassA 
{ 
    public ClassA() { } 
    public String HeadText { get; set; } 
} 

在此先感謝。

編輯:

如果我寫這篇文章,它的工作原理:

<Menu DockPanel.Dock="Top" ItemsSource="{Binding MItems}"> 
    <Menu.ItemContainerStyle> 
     <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}"> 
      <Setter Property="Header" Value="{Binding HeadText}"/> 
     </Style> 
    </Menu.ItemContainerStyle> 
</Menu> 

但我想這樣做的其他方式。我很感興趣,爲什麼其他方式不起作用。

回答

0

我找到了答案here。我的XAML首先是這樣的:

<Window.DataContext> 
     <local:MainVM/> 
    </Window.DataContext> 

    <Window.Resources> 
     <CollectionViewSource Source="{Binding Path=MItems}" x:Key="source"/> 
    </Window.Resources> 

    <StackPanel> 
     <Menu DockPanel.Dock="Top"> 
      <Menu.ItemContainerStyle> 
       <Style TargetType="MenuItem"> 
        <Setter Property="Header" Value="{Binding HeadText}"/> 
       </Style> 
      </Menu.ItemContainerStyle> 
     <Menu.ItemsSource> 
      <CompositeCollection> 
       <MenuItem Header="Static 1"/> 
       <MenuItem Header="Static 2"/> 
       <CollectionContainer Collection="{Binding Source={StaticResource source}}"/> 
       <MenuItem Header="Static 3"/> 
      </CompositeCollection> 
     </Menu.ItemsSource> 
    </Menu> 
</StackPanel> 

而且MainVM.cs和ClassA的:在案件

public class MainVM 
{ 
    public MainVM() { 
     _mItems.Add(new ClassA() { HeadText = "Dyn1" }); 
     _mItems.Add(new ClassA() { HeadText = "Dyn2" }); 
     _mItems.Add(new ClassA() { HeadText = "Dyn3" }); 
    } 

    private ObservableCollection<ClassA> _mItems = new ObservableCollection<ClassA>(); 
    public ObservableCollection<ClassA> MItems{ 
     get { return _mItems; } 
    } 
} 

public class ClassA 
{ 
    public ClassA() { } 

    private string _text = ""; 
    public String HeadText { 
     get { return _text; } 
     set { _text = value; } 
    } 
} 

這工作得很好,但你必須要注意到的Visual Studio會給你BindingExpression錯誤,你真的混合靜態和動態菜單項。

原因是XAML解析器將指定的ItemContainerStyle應用到靜態菜單項的動態AND:它創建一個新的MenuItem並將HeadText屬性綁定到新創建的MenuItem的Header屬性。這是爲動態菜單項以及靜態菜單項完成的。由於MenuItem類中沒有HeadText屬性,因此會顯示錯誤。

該應用程序不會崩潰,但它不是一個好的解決方案。解決方法是這樣拆分MenuBar像這樣:

<StackPanel> 
     <Grid DockPanel.Dock="Top"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions> 
      <Menu Grid.Column="0"> 
       <MenuItem Header="Static 1"/> 
       <MenuItem Header="Static 2"/> 
      </Menu> 
      <Menu Grid.Column="1"> 
       <Menu.ItemContainerStyle> 
        <Style TargetType="MenuItem"> 
         <Setter Property="Header" Value="{Binding HeadText}"/> 
        </Style> 
       </Menu.ItemContainerStyle> 
       <Menu.ItemsSource> 
        <CompositeCollection> 
         <CollectionContainer Collection="{Binding Source={StaticResource source}}"/> 
        </CompositeCollection> 
       </Menu.ItemsSource> 
      </Menu> 
      <Menu Grid.Column="2"> 
       <MenuItem Header="Static 3"/> 
      </Menu> 
     </Grid> 
    </StackPanel> 

也許有更好的解決方案。讓我知道如果是這樣。