Имея вложенную ViewModel и хотите добавить команду к владельцу viewmodel - PullRequest
0 голосов
/ 29 декабря 2011

У меня есть приложение 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;}
    }

Обратите внимание, что это "рекурсивно" ста же модель представления вложенная.Целью этого является представление древовидной структуры папок.Я представляю структуру данных, используя древовидную структуру, все работает отлично.Теперь мне нужно, чтобы мой «внешний» 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>

Нужно ли мне поднимать RoutedEvent в моей реализации IsSelected вручную (как это сделать?) ИлиЕсть лучший подход для этого.Проблема здесь в том, что я теперь знаю, какой экземпляр IRepositoryTreeFolderModel был выбран, поэтому я не могу подключить классический обработчик событий и распространять его - также хотел бы использовать весь потенциал RoutedCommand - я чувствую, что это то, что я долженсделать в этом сценарии ...

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Используйте для этого Дана Уолина DataContext Proxy .

0 голосов
/ 29 декабря 2011

Просто какая-то идея от меня. Сначала вы можете прочитать это 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}

Надеюсь, это поможет. Я не реализовал себя. Просто идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...