我使用 DataGrid
在我的 WPF 应用程序中显示一个 Animals 列表:
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,如下所示:
调试器确认:
我认为这与问题 WPF View sets ViewModel properties to null on closing 有关.但是我不能使用这些答案中提供的解决方法(即在我的 ComboBox
中设置 UpdateSourceTrigger=LostFocus
),因为我在编辑后直接保存实体,所以 LostFocus 更新是晚了。
有什么干净的方法可以避免这种行为吗?
最佳答案
问题似乎出在 ItemsSource 绑定(bind)上。当您导航到其他 View 时,ItemsSource 绑定(bind)返回 null,组合框中的项目被删除,SelectedItem 设置为 null 并且 SelectedItem.Binding 更新更新 Pen 属性。
您可以尝试以下方法之一:
- 尝试在ItemsSource 属性中使用OneTime 绑定(bind),这样它就不会被清除。
- ViewModel 的职责是让 View 轻松绑定(bind)。在 Pen 属性旁边添加 Pens 属性。没关系,每只动物都是一样的。它只是引用同一个集合,因此没有性能或一致性问题。
再多说一句。删除 SelectedValuePath
和 SelectedValue
绑定(bind)。首先,它们与 SelectedItem 冲突,其次,您错误地使用了它们 - 如果您具有 PenId 属性而不是 Pen 属性,则 SelectedValuePath="PenId"是有意义的。
关于c# - 关闭 View 会将 ViewModel 的属性设置为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31698289/