我使用DataGrid
在我的WPF应用程序中显示动物列表:
使用以下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,如下所示:
调试器确认它:
我认为这与问题WPF View sets ViewModel properties to null on closing有关。但我无法使用这些答案中提供的解决方法(即在我的UpdateSourceTrigger=LostFocus
中设置ComboBox
),因为我在编辑后直接保存了实体,因此LostFocus更新会延迟。
是否有任何干净的方法可以避免这种行为?
答案 0 :(得分:2)
问题似乎是ItemsSource绑定。当您导航到其他视图时,ItemsSource绑定返回null,组合框中的项被删除,SelectedItem被设置为null,SelectedItem.Binding更新更新Pen属性。
您可以尝试以下方法之一:
还有一条评论。删除SelectedValuePath
和SelectedValue
绑定。首先,它们与SelectedItem冲突,其次,你错误地使用它们--SelectedValuePath =&#34; PenId&#34;如果你有PenId属性而不是Pen属性,那就没有意义。
答案 1 :(得分:0)
将UpdateSourceTrigger
绑定上的SelectedItem
更改为Default
答案 2 :(得分:-1)
更改itemssource绑定并尝试一次。我的意思是代替来自Relative source datacontext的绑定,尝试从viewModel绑定并检查一次。