gpt4 book ai didi

c# - 如何在 ItemsSource 是另一个模型类的 ListView 中从 ViewModel 调用命令

转载 作者:太空宇宙 更新时间:2023-11-03 12:07:57 25 4
gpt4 key购买 nike

所以我得到了一个 View ,其中一个有一个 listView。这个 ListView 有一个 ItemSource“Persons”,这个 ListView 我有一些 CheckBox。

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

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

所以绑定(bind)有一些错误。

你能帮帮我吗?

我试过这个解决方案: 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 Error: 40 : BindingExpression path error: 'CanStartRAceCheckCommand' property not found on 'object' ''Person' (HashCode=43304686)'. BindingExpression:Path=CanStartRAceCheckCommand; DataItem='Person' (HashCode=43304686); target element is 'CheckBox' (Name=''); target property is 'Command' (type 'ICommand')

最佳答案

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

您必须遍历树,直到找到公开正确数据的元素。在您的情况下,绑定(bind)所需的数据源是 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? --> 改变一些其他控件的可见性。

关于c# - 如何在 ItemsSource 是另一个模型类的 ListView 中从 ViewModel 调用命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53926027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com