如何从ListView的ViewModel调用命令,其中ItemsSource是另一个模型类

时间:2018-12-25 22:32:17

标签: c# wpf xaml mvvm

所以我得到了一个视图,其中有一个listView。这个ListView有一个ItemSource“ Persons”,这个列表让我有了一些CheckBox。

选中一个CheckBox后,我想从我的ViewModel“ RaceSimulatorViewModel”执行命令“ CanStartRaceCheckCommand”。

但这不起作用,因为程序尝试从我的Person类中获取命令。

因此绑定存在一些错误。

你能帮我吗?

我尝试了以下解决方案: WPF MVVM: EventTrigger is not working inside 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路径错误:在“对象”“人”(HashCode = 43304686)上找不到“ CanStartRAceCheckCommand”属性。 BindingExpression:Path = CanStartRAceCheckCommand; DataItem ='Person'(HashCode = 43304686);目标元素是'CheckBox'(Name ='');目标属性为“命令”(类型为“ ICommand”)

1 个答案:

答案 0 :(得分:1)

标记扩展名'RelativeSource'用于绑定到DataContext外部的对象。与“ StaticResource”扩展相反,它适用于“ RelativeSource” Binding属性,而不是“ Source”属性。它可以用于遍历视觉树。请记住,您正在创建元素树。 “ RelativeSource”使您可以将该树遍历到根元素,并通过传递目标元素的类型和相对树级别来选择一个已访问元素作为绑定源。这类似于在Binding对象上设置'Source'属性,您将在其中指定数据源。数据本身或该源上数据的路径由Binding的'Path'属性设置。

您将不得不遍历树,直到找到暴露适当数据的元素。在您的情况下,绑定所需的数据源是ListView(在默认数据上下文->相对源之外)。 ListView通过“ DataContext”公开数据RaceSimulatorViewModel

所以

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

成为

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

通常,数据上下文由子元素继承。对于模板(ControlTemplateDataTemplate),这稍有不同。正如模板名称所暗示的,ControlTemplate用于描述控件,DataTemplate用于描述数据(或如何可视化)。因此,ControlTemplate的数据上下文是模板控件,而DataTemplate的数据上下文是模板数据(在您的情况下为Person数据对象)。这使得可视化可以基于数据状态,例如'Person.Age'<18->将其绘制为红色。相反,ControlTemplate主要基于控制状态,例如CheckBox.IsChecked? ->更改其他控件的可见性。