我将简化事情以使一切尽可能清晰。假设我有当前模型:
public class Product
{
public int Id {get;set;}
public string Name {get;set;}
public int GroupId {get;set;}
public Group Group {get;set;}
}
public class Group
{
public int Id {get;set;}
public string Name {get;set;}
}
假设我有类似这样的 xaml:(Source 是通过 ViewModel 公开的 Product 类型的公共属性,GroupList 是 Group 的 ObservableCollection,也通过 ViewModel 公开):
<TextBlock Text="Id" />
<TextBox Grid.Column="1" Text="{Binding Source.Id}" />
<TextBlock Grid.Row="1" Text="Name" />
<TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Source.Name}" />
<TextBlock Grid.Row="2" Text="Group" />
<ComboBox Grid.Column="1" Grid.Row="2"
DisplayMemberPath="Name"
ItemsSource="{Binding GroupList}"
SelectedValue="{Binding Source.GroupId}"
SelectedValuePath="Id"
/>
这一切都很好。但是,想象一下,出于某种原因,我需要刷新 GroupList 中的项目。调用 ViewModel 上的 ICommand,获取数据,并将 GroupList 设置为新列表。似乎刷新 GroupList 导致重置当前产品的 GroupId,将其设置为 NULL。
为什么会发生这种情况,除了在刷新列表后手动将其设置为之外,最好的处理方法是什么?GroupId 属性被更改的事实并不好,因为该属性的 PropertyChanged 可能有一些操作。出于这个原因,我还需要引入一个私有布尔变量_isRefreshing Groups,这样我就可以在根本不需要的时候阻止一些操作,而这一切都会“污染”代码。