すべてをできるだけ明確にするために、物事を単純化するつもりです。現在のモデルがあるとしましょう:
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 でいくつかのアクションが発生する可能性があるため、適切ではありません。そのため、プライベート bool 変数 _isRefreshing Groups も導入する必要があります。これにより、まったく必要のないアクションを防ぐことができます。これにより、コードがすべて「汚染」されます。