我正在使用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
--> Page 1
--> Page 2
--> Page 3
文件2
--> Page 1
--> Page 2
我希望这个例子很清楚。
我已经编写了这个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>
你有什么想法我可以让它运行吗?
答案 0 :(得分:2)
在WPF中显示分层数据的最佳方法是使用HierarchicalDataTemplate
Class。此类扩展DataTemplate
类并添加必要的ItemsSource
属性。使用此属性,您可以定义用于表示子对象的集合属性:
<HierarchicalDataTemplate DataType="{x:Type YourXmlNamespacePrefix:YourClass}"
ItemsSource="{Binding YourChildCollectionProperty}">
<TextBlock Text="{Binding SomeProperty}" />
</HierarchicalDataTemplate>
有关代码示例和此类的完整说明,请参阅MSDN上的HierarchicalDataTemplate
Class页面。