Как вызвать команду из ViewModel в ListView, где ItemsSource - это другой класс модели - PullRequest
0 голосов
/ 26 декабря 2018

Итак, я получил представление, которое получил listView.Этот ListView получил ItemSource "Persons", и в этом списке я получил несколько CheckBox.

Когда CheckBox проверен, я хочу выполнить команду "CanStartRaceCheckCommand" из моей ViewModel "RaceSimulatorViewModel".

Но это не работает, потому что программа пытается получить команду от моего класса Person.

Так что есть некоторые ошибки привязок.

Можете ли вы помочь мне?

Я пробовал это решение: WPF MVVM: EventTrigger не работает внутри CheckBox

Есть Xaml:

<ListView ItemsSource="{Binding Persons}" Grid.Row="1" Margin="40,100,367,46" Grid.RowSpan="3" Grid.ColumnSpan="2"  >
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Full Name"  DisplayMemberBinding="{Binding Path=Name}"/>
            <GridViewColumn Header="Participe to race" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <!--<CheckBox IsChecked="{Binding Path=IsParticipateToRace}" Command="{Binding CanStartRaceCheckCommand, RelativeSource={RelativeSource AncestorType={x:Type vm:RaceSimulatorViewModel}, AncestorLevel=1}}"></CheckBox>-->
                        <!--<CheckBox Command="{Binding CanStartRaceCheckCommand}" CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}" />-->
                        <CheckBox IsChecked="{Binding Path=IsParticipateToRace}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

и таммой вывод: System.Windows.Data Ошибка: 40: Ошибка пути BindingExpression: свойство 'CanStartRAceCheckCommand' не найдено для 'объекта' '' Person '(HashCode = 43304686)'.BindingExpression: Path = CanStartRAceCheckCommand;DataItem = 'Person' (HashCode = 43304686);Целевым элементом является 'CheckBox' (Name = '');целевое свойство 'Command' (тип 'ICommand')

1 Ответ

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

Расширение разметки ' RelativeSource ' используется для привязки к объекту за пределами DataContext.В отличие от расширения «StaticResource», оно применяется к свойству «RelativeSource» Binding вместо свойства «Source».Его можно использовать для обхода визуального дерева.Имейте в виду, что вы создаете дерево элементов.«RelativeSource» позволяет вам пройти это дерево обратно к корневому элементу и выбрать один посещенный элемент в качестве источника привязки, передав тип целевого элемента и уровень относительного дерева.Это похоже на установку свойства 'Source' для объекта Binding, где вы указали бы источник данных.Сами данные или путь к данным в этом источнике задаются свойством «Путь» Binding.

Вам придется обходить дерево, пока не найдете элемент, который предоставляет правильные данные.В вашем случае обязательным источником данных привязки является ListView (который находится вне контекста данных по умолчанию -> относительный источник).ListView предоставляет данные RaceSimulatorViewModel через DataContext.

То есть

Command="{Binding DataContext.CanStartRaceCheckCommand, RelativeSource={RelativeSource AncestorType={x:Type vm:RaceSimulatorViewModel}, AncestorLevel=1}}"

становится

Command="{Binding DataContext.CanStartRaceCheckCommand, RelativeSource={RelativeSource AncestorType=ListView}}"

В общем случае контекст данных наследуется дочерними элементами.Для шаблонов (ControlTemplate, DataTemplate) это немного отличается.Как следует из названий шаблонов, ControlTemplate используется для описания элемента управления и DataTemplate для описания данных (или того, как они визуализируются).Поэтому контекст данных ControlTemplate является шаблонным элементом управления, тогда как контекст данных DataTemplate является шаблонными данными (в вашем случае Person объект данных).Это позволяет основывать визуальные эффекты на состоянии данных, например, «Person.Age» <18 -> рисует их красным.ControlTemplate в отличие, в основном, основано на состоянии управления, например, CheckBox.IsChecked?-> изменить видимость другого элемента управления.

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