WPF MVVM: привязать команду, которая находится на ViewModel в дочернем элементе ItemSource

Я использую WPF с MVVM design-patern, и мне нужно привязать команду, которая является родительским элементом привязки ItemsSource: Вид :

<Window x:Class = "TaskSupervisor.MainWindow"
        ...
        ...>
    <Window.DataContext>
        <local:TacheGroupeViewModel/>
    </Window.DataContext>
    <Grid>
        <TreeView x:Name = "TachesTree" ItemsSource = "{Binding TachesGroupes.GroupesConfig}">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource = "{Binding Value.Tasks}">
                    <HierarchicalDataTemplate.ItemTemplate>
                        <DataTemplate>
                            <Grid>
                              <CheckBox x:Name = "InProgress" 
                                          IsChecked = "{Binding ModifInProgress}">
                                </CheckBox>

                                <StackPanel Grid.Row = "2" Grid.Column = "2" Orientation = "Horizontal">
                                    ...
                                </StackPanel>

                                <StackPanel Grid.Row = "3" Grid.Column = "2" Orientation = "Horizontal">
                                    ...
                                </StackPanel>
                            </Grid>
                        </DataTemplate>
                    </HierarchicalDataTemplate.ItemTemplate>
                    <TextBlock Text = "{Binding Value.DisplayGroupe, Mode=OneWay}"/>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>
    </Grid>
</Window>

ViewModel:

class TacheGroupeViewModel : INotifyPropertyChanged {

    public Model.TachesGroupes TachesGroupes { get; set; }

    public TacheGroupeViewModel() {
        this.TachesGroupes = new Model.TachesGroupes();
        // return a  Dictionary<string, CustomClass> Object
       // CustomClass => Contain some field and a List Of custom class
    }

    private ICommand _cmdEnCoursDeTraitement;
    public ICommand CmdEnCoursDeTraitement {
        get {
            return _cmdEnCoursDeTraitement ?? ( _cmdEnCoursDeTraitement = new RelayCommand(x => {Test(); }) );
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void RaisePropertyChanged(string propertyName) {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }


    public void Test() {
        var test = "xD";
    }
}

Я хочу привязать свой объект Checkbox: как я могу это сделать, когда для источника Items HierarchicalDataTemplate установлено значение «Tasks», я могу привязать только свои поля «Tasks». Как получить родительский элемент для ItemSource?

Вы бы использовали привязку к родственному источнику. Я не понимаю, где будет modifinprogress. Если он находится в элементе просмотра дерева, который находится на один уровень выше, то Binding DataContext.YouProperty, родственный источник типа предка treeviewitem и уровень предка 2. Если он находится в модели просмотра окна, то родственным источником будет древовидное представление (которое предположительно будет иметь тот же текст данных, что и окно).

Andy 10.04.2018 16:20

Другой вариант - добавить ссылку на родительский элемент на TacheGroupeViewModel и перейти по ней для привязки.

Bradley Uffner 10.04.2018 16:22

Возможно, я делаю это неправильно, это мое первое настоящее приложение MVVM, может быть, есть более глубокая проблема с тем, как я это делаю

Hyro 10.04.2018 16:33

Где команда? Я не вижу, есть ли в XAML.

Michael Puckett II 10.04.2018 16:37

Здесь нет причины неправильной привязки. Но если бы я привязал команду к флажку, как я могу получить свою команду ViewModel Icommand?

Hyro 10.04.2018 16:46

Похоже, ваша модель просмотра - это то, к чему привязан Window. Просто назовите элемент Window и укажите ElementName как часть привязки к DataContext. Итак, <CheckBox Command = "{Binding Path=DataContext.CmdEnCoursDeTraitement, ElementName=TheWindowName}" />.

Bradley Uffner 10.04.2018 17:12

Вы до сих пор не объяснили, где будет находиться команда. Или где вы хотите, чтобы это было.

Andy 10.04.2018 20:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
209
1

Ответы 1

вместо того, чтобы найти правильную модель родителя и представления ... У меня был шаблон Forward в основном для контекстного меню ...

Вся моя модель представления имеет эту команду

private ICommand forwardCommand;
    public ICommand ForwardCommand
    {
        get
        {
            if (forwardCommand == null)
                forwardCommand = new RelayCommand<string>(
                    delegate(string param)
                    {
                        Messenger.Default.Send<CommandContext>(GetForwardCommandContext(param),
                            ViewModelBaseMessages.ContextCommand );
                    },
                    delegate(string param)
                    {
                        return CanForwardCommand(param);
                    });
            return forwardCommand;
        }
    }

затем он пересылается в модель представления, которая зарегистрировалась в forward_message

Messenger.Default.Register<CommandContext>(this, ViewModelBaseMessages.ContextCommand,
            (CommandContext o) =>
            {
                ExecuteDistantCommand( o );
            } );

вы можете найти этот код в моем проекте на github пожалуйста, используйте mvvm nuget, например mvvmlight, и не изобретайте колесо ... ;-)

Другие вопросы по теме