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

标签 c# wpf mvvm

我使用 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/

相关文章:

c# - 如何判断是鼠标选中还是按键选中?

c# - 如何访问所有设置显示采集向导

c# - IReflect 和 DispId

wpf - 为什么在我的 WPF View 中标签控件的内容文本不可见?

.net - 2009 年 6 月的 WPF 工具包在将发送给客户的应用程序中使用是否安全?

android - Realm 结果的 LiveData Observer 第一次没有被触发

c# - WPF 应用程序的异步和填充数据

c# - ASP.NET 网页 (Razor) 中的验证已弃用?

c# - 如何在 C#/ASP 中的单例中使用作用域依赖

c# - WPF统计一段视频的帧数C#