我有一个WPF应用程序,其工作区类似于计算机上的文件系统。我有一个ViewModel,它包含顶层文件夹和子文件夹列表:
public interface IRepositoryViewModel : IViewModelBase
{
ObservableCollection<IRepositoryTreeFolderModel> RootFolders { get; set; }
}
IRepositoryTreeFolderModel描述如下:
public interface IRepositoryTreeFolderModel : IViewModelBase
{
Folder Folder { get; set; }
ObservableCollection<IRepositoryTreeFolderModel> SubFolders { get; set; }
bool IsSelected {get;set;}
bool IsExpanded {get;set;}
}
请注意,这是“递归”,嵌套了相同的viewmodel。这样做的目的是表示文件夹的树结构。我使用树视图表示数据结构,一切都很完美。现在,当我在树中选择一个文件夹时,我需要知道我的“外部”IRepositoryViewModel。这是我认为我缺少的东西。我想做的是创建一个RoutedCommand,并在我的外部“IRepositoryViewModel”中使用它
My XAML for the treeView in the workarea is like this:
<TreeView Background="{x:Null}" ItemsSource="{Binding RootFolders}" >
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
<Setter Property="FontWeight" Value="Normal" />
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="FontWeight" Value="Bold" />
</Trigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding SubFolders}">
<StackPanel Orientation="Horizontal">
<Image Source="/GWManagerAdmin;component/Graphics/Navigation/folder.png" Stretch="None" />
<TextBlock Text="{Binding Path=Folder.Name}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
我是否需要手动提升我的IsSelected实现中的RoutedEvent(如何做?)或者是否有更好的方法来执行此操作。这里的问题是我现在知道选择了哪个IRepositoryTreeFolderModel实例,所以我不能连接一个经典的事件处理程序并将其传播 - 也想利用RoutedCommand的全部潜力 - 我觉得这就是我应该做的在这种情况下......
答案 0 :(得分:0)
我的一些想法。首先,您可以阅读此http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html来构建您的。
在XAML中,您可以通过以下代码段从父级调用命令:
Command={Binding RelativeResource={RelativeResource FindAncestor, AncestorType={x:Type TreeView}}, Path=DataContext.YourCommand}
CommandArgument={Binding}
希望它有所帮助。我没有实现自己。只是一个想法。
答案 1 :(得分:0)
请使用Dan Wahlin的DataContext Proxy。