关闭视图会将ViewModel的属性设置为null

时间:2015-07-29 10:46:41

标签: c# wpf mvvm

我使用DataGrid在我的WPF应用程序中显示动物列表:

enter image description here

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

<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,我的ViewModel的一些属性被设置为null。如果我重新打开View,则将笔设置为null,如下所示:

enter image description here

调试器确认它:

enter image description here

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

是否有任何干净的方法可以避免这种行为?

3 个答案:

答案 0 :(得分:2)

问题似乎是ItemsSource绑定。当您导航到其他视图时,ItemsSource绑定返回null,组合框中的项被删除,SelectedItem被设置为null,SelectedItem.Binding更新更新Pen属性。

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

  1. 尝试在 ItemsSource 属性中使用 OneTime绑定,因此不会将其清除。
  2. ViewModel的职责是允许视图轻松绑定。在Pen 属性旁边添加钢笔属性。不要紧,它将是同一种foreach动物。它只是对同一个集合的引用,因此没有性能或一致性问题。
  3. 还有一条评论。删除SelectedValuePathSelectedValue绑定。首先,它们与SelectedItem冲突,其次,你错误地使用它们--SelectedValuePath =&#34; PenId&#34;如果你有PenId属性而不是Pen属性,那就没有意义。

答案 1 :(得分:0)

UpdateSourceTrigger绑定上的SelectedItem更改为Default

答案 2 :(得分:-1)

更改itemssource绑定并尝试一次。我的意思是代替来自Relative source datacontext的绑定,尝试从viewModel绑定并检查一次。