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