gpt4 book ai didi

c# - 关闭 View 会将 ViewModel 的属性设置为 null

转载 作者:行者123 更新时间:2023-11-30 17:42:43 25 4
gpt4 key购买 nike

我使用 DataGrid 在我的 WPF 应用程序中显示一个 Animals 列表:

enter image description here

ComboBox“Bucht”的值是使用以下 XAML 从我的 ViewModel 中的另一个集合 Pens 加载的,它工作正常:

<DataGrid ItemsSource="{Binding Path=Animals, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectionMode="Single" AutoGenerateColumns="False" CanUserSortColumns="True">
<DataGrid.Columns>
<DataGridTextColumn Header="EPC" Binding="{Binding Epc, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Visual ID" Binding="{Binding VisualId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTextColumn Header="Geschlecht" Binding="{Binding Gender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
<DataGridTemplateColumn Header="Bucht">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.Pens, RelativeSource={RelativeSource AncestorType={x:Type view:AdministrationView}}}"
DisplayMemberPath="Name"
SelectedItem="{Binding Pen, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
SelectedValue="{Binding Pen.PenId}"
SelectedValuePath="PenId">
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding DataContext.SaveCommand, RelativeSource={RelativeSource AncestorType={x:Type view:AdministrationView}}}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

现在的问题:如果 View 关闭,例如通过单击另一个 View ,我的 ViewModel 的一些属性被设置为 null。如果我重新打开 View ,笔将设置为 null,如下所示:

enter image description here

调试器确认:

enter image description here

我认为这与问题 WPF View sets ViewModel properties to null on closing 有关.但是我不能使用这些答案中提供的解决方法(即在我的 ComboBox 中设置 UpdateSourceTrigger=LostFocus),因为我在编辑后直接保存实体,所以 LostFocus 更新是晚了。

有什么干净的方法可以避免这种行为吗?


最佳答案

问题似乎出在 ItemsSource 绑定(bind)上。当您导航到其他 View 时,ItemsSource 绑定(bind)返回 null,组合框中的项目被删除,SelectedItem 设置为 null 并且 SelectedItem.Binding 更新更新 Pen 属性。

您可以尝试以下方法之一:

  1. 尝试在ItemsSource 属性中使用OneTime 绑定(bind),这样它就不会被清除。
  2. ViewModel 的职责是让 View 轻松绑定(bind)。在 Pen 属性旁边添加 Pens 属性。没关系,每只动物都是一样的。它只是引用同一个集合,因此没有性能或一致性问题。

再多说一句。删除 SelectedValuePathSelectedValue 绑定(bind)。首先,它们与 SelectedItem 冲突,其次,您错误地使用了它们 - 如果您具有 PenId 属性而不是 Pen 属性,则 SelectedValuePath="PenId"是有意义的。

关于c# - 关闭 View 会将 ViewModel 的属性设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31698289/

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