2015-02-10 151 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> 

也许有更好的解决方案。让我知道如果是这样。