入口を含むシステムを含む領域の形式の階層データがいくつかあります。 私の WPF アプリケーションには、属性として入口を持つ旅行のリストがあります。UI は、ListControl と、次のように ListView.SelectedItem プロパティにバインドされた「詳細」コントロールを含む分割ウィンドウです (コードは簡潔にするために編集され、関連する部分のみが示されています)。
<local:ListView x:Name="listView"/>
<local:DetailsView DataContext="{Binding ElementName=listView, Path=SelectedItem}"/>
詳細ビューは、属性の ComboBox で構成されています。
<ComboBox Name="comboRegion" SelectionChanged="Region_Changed"
ItemsSource="{Binding ElementName=main, Path=Regions, Mode=OneWay}" DisplayMemberPath="Name"
SelectedItem="{Binding Region, Mode=OneWay}"/>
<ComboBox Name="comboSystem" SelectionChanged="System_Changed"
ItemsSource="{Binding ElementName=main, Path=Systems, Mode=OneWay}" DisplayMemberPath="Name"
SelectedItem="{Binding System, Mode=OneWay}"/>
<ComboBox ItemsSource="{Binding ElementName=main, Path=Entrances, Mode=OneWay}" DisplayMemberPath="Name"
SelectedItem="{Binding Enter}"/>
Trip.Enter は編集したい属性で、Trip.Region と Trip.System は読み取り専用で、Trip.Enter から計算されます。main.Regions、main、systems、および main.Entrances は、次のコードを持つコントロールに対してローカルなリストです。
public IEnumerable<Region> Regions { get; private set; }
public IEnumerable<CaveSystem> Systems { get; private set; }
public IEnumerable<Entrance> Entrances { get; private set; }
private void Region_Changed(object sender, SelectionChangedEventArgs e)
{
Region = comboRegion.SelectedItem as Region;
Systems = (region != null ? region.Systems : null);
NotifyPropertyChanged("Systems");
}
private void System_Changed(object sender, SelectionChangedEventArgs e)
{
... Equivalent to Region_Changed except updates Entrances ...
}
Regions リストは静的であるため、一度入力されます。新しい地域が選択されると、システム リストに新しいリストが再入力されます。新しいシステムが選択されると (地域の変更からのカスケードとしても)、入口リストが再入力されます。
ここまでは順調ですね。これは期待どおりに機能し、リスト ビューで旅行を選択すると、その詳細がコンボ ボックスにバインドされます。コンボ ボックスの値を変更すると、適切な「下位レベル」のボックスが新しいリストで更新されます。最後に、入口を選択すると、レコード自体が更新されます (リスト ビューは適切に更新されます)。
問題は次のとおりです。リスト ビューで新しいレコードを選択すると、新しいレコードの値がコンボ ボックスに表示されますが、最後に選択したレコードにもコピーされます。
問題は、詳細ビューのデータ コンテキストを変更すると、バインディングがすべて更新されることだと思います。これは順番に発生すると思いますが、選択した領域を変更すると、下位レベルのコンボ ボックスにも波及効果が生じ、それも変更されます。その時点で、彼らはまだ古い記録に縛られていると思います。
誰でもこれを回避する方法を提案できますか?