Связывание команд TreeViewItem - PullRequest
0 голосов
/ 05 декабря 2018

Мне нужно щелкнуть TreeViewItem и открыть диалоговое окно с данными этого TreeViewItem, позже на основе этих данных я выполню другую команду.Моя настоящая проблема: я не могу щелкнуть по нему, потому что у treeviewitem нет свойства команды.

Мой сценарий: у меня есть 2 модели с 2 свойствами, которые будут использоваться для создания моих TreeViewItems.В моей ViewModel я создаю их и организую их друг в друге на основе их свойств, а затем сохраняю их в One Collection.

Вот мой xaml для привязки элементов:

<TreeView ItemsSource="{Binding Local}">
    <TreeView.DataContext>
    <data:ItemViewModel/>
    </TreeView.DataContext>
</Treeview>
//In my "Local" property i have 3 TreeViewItems with other items inside them wich i want to execute the commands

Я не могнайти способ создать таблицу данных для этого конкретного сценария.Даже пытался создать табличку с гиперссылкой (думал, что это будет временное решение) внутри нее, но не выполнял никаких команд.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы должны связываться с коллекцией, чьи объекты имеют коллекцию как открытое свойство и шаблонизировать по типу все, что вы хотите видеть в каждом элементе дерева.

Как в этом примере: https://docs.microsoft.com/en-us/dotnet/api/system.windows.hierarchicaldatatemplate?view=netframework-4.7.2

Технически, вы могли бы иметь кнопку, шаблон которой был бы текстовым блоком или чем-то еще, и тогда бы поведение кнопки было таким, как нажатие и команда.Но я бы с большей вероятностью использовал привязку ввода.

Вот пример:

 <DataTemplate DataType="{x:Type local:LineTerrainVM}">
    <Grid Background="Transparent">
        <Grid.InputBindings>
            <MouseBinding MouseAction="RightClick" Command="{Binding FixLineCommand}"/>
        </Grid.InputBindings>

Вы можете дать этому параметру команды = "{Binding.}", И он пройдетviewmodel в качестве параметра.Вы также можете использовать родственный источник в текстовом виде древовидного представления, чтобы перейти к родительской модели представления и определить в ней команду для выполнения своих задач.

Поскольку эти вещи, которые вы хотите сделать, являются обязанностью просмотра, на которую можно положиться,события без "взлома" мввм.Щелчок в любом древовидном элементе может быть обработан на уровне древовидного объекта и использовать источник originals для перехода к нажатому древовидному элементу.Затем возьмите его datacontext для модели представления чего бы то ни было.Грубая идея:

    <TreeView Name="tv" ItemsSource="{Binding Families}"                   FrameworkElement.PreviewMouseLeftButtonDown="Tv_PreviewMouseLeftButtonDown"

И обработчик:

    private void Tv_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        var vm = ((FrameworkElement)e.OriginalSource).DataContext;
        // do something with viewmodel
    }

Затем вы можете сделать что-то вроде нового в своем диалоговом окне, установить его datacontext для той только что полученной вами модели представления и показать ее диалог.

0 голосов
/ 05 декабря 2018

Шаблон MVVM предназначен для использования одной из множества реализаций «Event to Command».По сути, вы связываете объект «Событие с командой» с событием Click, а затем команда в вашей виртуальной машине связывается с объектом «Событие с командой», и она отображается за кулисами для вас и обрабатывает все включенные / отключенные элементы.

Пример одной из реализаций вы можете увидеть здесь: Связывание событий пользовательского интерфейса WPF с командами в ViewModel

...