Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ItemsSource是其他模型类的ListView中从ViewModel调用命令_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 如何在ItemsSource是其他模型类的ListView中从ViewModel调用命令

C# 如何在ItemsSource是其他模型类的ListView中从ViewModel调用命令,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,所以我有一个视图,其中一个有一个列表视图。这个列表视图有一个ItemSource“Persons”,这个列表有一些复选框 选中复选框后,我希望从我的ViewModel“RaceSimulatorViewModel”中执行命令“CanStartRaceCheckCommand” 但这不起作用,因为程序试图从我的类人员那里获取命令 因此,绑定存在一些错误 你能帮帮我吗 我尝试过这个解决方案: 有一个Xaml: <ListView ItemsSource="{Binding Persons}"

所以我有一个视图,其中一个有一个列表视图。这个列表视图有一个ItemSource“Persons”,这个列表有一些复选框

选中复选框后,我希望从我的ViewModel“RaceSimulatorViewModel”中执行命令“CanStartRaceCheckCommand”

但这不起作用,因为程序试图从我的类人员那里获取命令

因此,绑定存在一些错误

你能帮帮我吗

我尝试过这个解决方案:

有一个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)“上找不到CanStarTraceCECKCommand”属性。BindingExpression:Path=CanStartRAceCheckCommand;DataItem='Person'(HashCode=43304686);目标元素为“复选框”(名称=“”);目标属性为“Command”(类型为“ICommand”)

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

您必须遍历树,直到找到一个显示正确数据的元素。在您的情况下,绑定所需的数据源是
ListView
(在默认数据上下文-->相对源之外)。
ListView
通过“数据上下文”公开数据
RaceSimulatorViewModel

所以

变成

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

通常,数据上下文由子元素继承。对于模板(
ControlTemplate
DataTemplate
),这略有不同。正如模板名称所示,
ControlTemplate
用于描述控件,
DataTemplate
用于描述数据(或数据的可视化方式)。因此,
ControlTemplate
的数据上下文是模板化控件,
DataTemplate
的数据上下文是模板化数据(在您的例子中是
Person
数据对象)。这样就可以根据数据的状态进行可视化,例如“Person.Age”<18-->将其绘制为红色<代码>控制模板相比之下,基本上是基于控制状态的,例如,
复选框。是否选中
?-->更改某些其他控件的可见性。

您在这里遇到了类似的问题,我尝试了:System.Windows.Data错误:4:找不到用于绑定的源,引用为“RelativeSource FindAncestor,AncestorType='RaceSimulator.ViewModel.RaceSimulatorViewModel',AncestorLevel='1'。BindingExpression:Path=DataContext.CanStartRaceCheckCommand;DataItem=null;目标元素为“复选框”(名称=“”);目标属性为“Command”(类型为“ICommand”),非常感谢您的帮助,您的解释非常有用
Command="{Binding DataContext.CanStartRaceCheckCommand, RelativeSource={RelativeSource AncestorType=ListView}}"