有一个嵌套的ViewModel,并希望将命令冒泡到拥有的viewmodel

时间:2011-12-28 21:50:59

标签: wpf mvvm

我有一个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的全部潜力 - 我觉得这就是我应该做的在这种情况下......

2 个答案:

答案 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