うーん、それが「いい」方法かどうかはわかりませんが、リロードが発生する前に選択したアイテムにアクセスできる場合は、それ(またはそのキーなど)を保存し、リロード後にプログラムで再度選択することができます。終わり。
クイックモックアップ:
var selectedItem = myCombo.SelectedItem;
DoReload();
myCombo.SelectedItem = selectedItem;
しかし、私はあなたがこのマニュアルの回避策とは別の方法を意味していると思いますか?
これがとにかく役立つことを願っています...
UPDATE
わかりました、バックグラウンドスレッドからです。
ICollectionViewを使用してコンボボックスもバインドしていますか?その場合は、CurrentItemプロパティを使用して参照を保持できます。簡単なモックアップを作成しましたが、これは私のセットアップで機能しています。これは、UIへの参照があることを前提としています。
XAML
<Grid VerticalAlignment="Top">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<ComboBox ItemsSource="{Binding Items}" IsSynchronizedWithCurrentItem="True" Grid.Column="0" Grid.Row="0" DisplayMemberPath="Name"/>
<Button Command="{Binding UpdateCommand}" Grid.Column="1" Grid.Row="0">Update</Button>
</Grid>
View / ViewModel
public partial class Window1 : Window {
public Window1() {
InitializeComponent();
this.DataContext = new ViewModel(this);
}
}
public class ViewModel
{
private readonly Window1 window;
private ObservableCollection<Item> items;
private ICollectionView view;
public ViewModel(Window1 window) {
this.window = window;
items = new ObservableCollection<Item>
{
new Item("qwerty"),
new Item("hello"),
new Item("world"),
};
view = CollectionViewSource.GetDefaultView(items);
}
public ObservableCollection<Item> Items { get { return items; } }
public ICommand UpdateCommand {
get { return new RelayCommand(DoUpdate); }
}
public Item SelectedItem { get; set; }
private void DoUpdate(object obj) {
var act = new Func<List<Item>>(DoUpdateAsync);
act.BeginInvoke(CallBack, act);
}
private List<Item> DoUpdateAsync() {
return new List<Item> {
new Item("hello"),
new Item("world"),
new Item("qwerty"),
};
}
private void CallBack(IAsyncResult result) {
try {
var act = (Func<List<Item>>)result.AsyncState;
var list = act.EndInvoke(result);
window.Dispatcher.Invoke(new Action<List<Item>>(delegate(List<Item> lst) {
var current = lst.Single(i => i.Name == ((Item)view.CurrentItem).Name);
Items.Clear();
lst.ForEach(Items.Add);
view.MoveCurrentTo(current);
}), list);
} catch(Exception exc){ Debug.WriteLine(exc); }
}
}
public class Item {
public Item(string name) {
Name = name;
}
public string Name { get; set; }
}
選択したアイテムがリストに含まれなくなった場合に備えて、何らかの処理を行う必要があります。IsSynchronizedWithCurrentItem
プロパティは
ここで重要です。そうでないと機能しません!
また、メインウィンドウへの参照は、DIフレームワークによるものである必要があります。