带有DataTemplate的嵌套菜单项

时间:2014-01-28 11:57:56

标签: c# wpf xaml data-binding mvvm

我正在使用MVVM编写WPF应用程序,现在我在构建嵌套菜单时遇到了问题:

我有两个名为ThumbnailDocument和ThumbnailPage的对象。在我的ViewModel中,我有一个ThumbnailDocuments的ObservableCollection,在ThumbnailDocuments中我有一个ThumbnailPage的ObservableCollection

以下是代码:

ViewModel类:

public class ThumbnailPageViewModel : ViewModelBase
{
    public ThreadSafeObservableCollection<ThumbnailDocument> Documents
    {
        get { return this._CurrentlyLoadedDocs; }
    }
}

ThumbnailDocument类:

public class ThumbnailDocument : INotifyPropertyChanged, IDisposable
{ 
    public ThreadSafeObservableCollection<ThumbnailPage> ThumbnailPages
    {
        get { return _ThumbnailPages; }
    }

    public string DocumentTitle { get; set; }
}

ThumbnailPage类:

public class ThumbnailPage : INotifyPropertyChanged, IDisposable
{
    public int PageNumber { get; private set; }
}

现在我想创建一个具有以下结构的嵌套菜单:

标题输入 - &gt;所有文件标题 - &gt;对于我将鼠标悬停在页码

上的每个文档

例如:标题输入 - &gt;

  1. 文件1

           --> Page 1
           --> Page 2
           --> Page 3
    
  2. 文件2

           --> Page 1
           --> Page 2
    
  3. 我希望这个例子很清楚。

    我已经编写了这个XAML部件,但它不起作用:

    <MenuItem Header="{Binding Source={StaticResource thumbnailViewModel}, Path=Ctx_Move_Pages}"
        ItemContainerStyle="{StaticResource MovePages_MenuItemContainerStyle}"
        ItemsSource="{Binding Source={StaticResource thumbnailViewModel}, Path=LoadedDocuments}">                                    
        <MenuItem.ItemTemplate>
            <DataTemplate DataType="ThumbnailDocument">
                <MenuItem ItemsSource="{Binding ThumbnailPages}">
                    <MenuItem.ItemContainerStyle>
                        <Style TargetType="MenuItem">
                            <Setter Property="Header" Value="{Binding PageNumber}"></Setter>
                        </Style>
                    </MenuItem.ItemContainerStyle>
                </MenuItem>
            </DataTemplate>
        </MenuItem.ItemTemplate>
        <MenuItem.Icon>
            <Image Source="{StaticResource MovePageSmall}" Width="16" Height="16"/>
        </MenuItem.Icon>
    </MenuItem>
    

    风格:

    <Style x:Key="MovePages_MenuItemContainerStyle" TargetType="MenuItem">
        <EventSetter Event="PreviewMouseLeftButtonDown" Handler="MovePages_MenuItem_Clicked" />
        <Setter Property="Header" Value="{Binding DocumentTitle}"></Setter>
    </Style>
    

    你有什么想法我可以让它运行吗?

1 个答案:

答案 0 :(得分:2)

在WPF中显示分层数据的最佳方法是使用HierarchicalDataTemplate Class。此类扩展DataTemplate类并添加必要的ItemsSource属性。使用此属性,您可以定义用于表示子对象的集合属性:

<HierarchicalDataTemplate DataType="{x:Type YourXmlNamespacePrefix:YourClass}" 
    ItemsSource="{Binding YourChildCollectionProperty}">
    <TextBlock Text="{Binding SomeProperty}" />
</HierarchicalDataTemplate>

有关代码示例和此类的完整说明,请参阅MSDN上的HierarchicalDataTemplate Class页面。