私のアプリケーションにアンドゥ/リドゥ機能を実装していて、問題が発生しました。基本的には、アイテムのリストにバインドされたコンボボックスがあります。次に、コンボボックスで選択した項目のDataContextとその項目のプロパティにバインドされたテキストを持つ複数のテキストボックスがあります。ユーザーが元に戻すコマンドを発行し、元に戻す項目がテキストボックスのテキストの変更である場合、コンボボックス内の関連する項目を最初に選択します。次に、元のテキストでテキストボックスを直ちに更新したいと思います。これは、理論的には、選択した項目のデータバインドプロパティを更新する必要があります。ただし、選択範囲が変更されますが、テキストボックスのテキストプロパティを変更する前にデータバインドされたテキストボックスが更新されないため、コンボボックスで前に選択したアイテムのプロパティ値が変更されています。ComboBox.SelectedItemにバインドされたTextbox DataContextを強制的に更新できますか?
これは私のコンボボックスである:
<ComboBox x:Name="myComboBox"
ItemsSource="{Binding MyItems, UpdateSourceTrigger=PropertyChanged}"
DisplayMemberPath="Name"
SelectionChanged="myComboBox_SelectionChanged" />
これは私のテキストボックスである(のDataContextは、親グリッドに設定されているのDataContextは、テキストボックス自体に設定されている場合、同じ現象が発生。)
<TextBox x:Name="purposeTxtBox"
Text="{Binding Purpose, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
アンドゥが開始されると、私が使用しています
コード(抜粋)は次のとおりです。
case UndoAction.PURPOSE_CHANGE:
SelectComboBoxItem(myComboBox, itemToSelect);
purposeTxtBox.Text = itemValue;
FocusAndSelect(purposeTxtBox);
そして、 SelectComboBoxItemメソッド:
private void SelectComboBoxItem(ComboBox box, object item)
{
Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate()
{
box.SelectedItem = item;
}));
}
私のDataContextの 'Purpose'プロパティを更新することができます。それはうまくいきますが、私がそのようにすれば、それは集中したり選択したりしません。さらに、すべてのバインディングが既に存在し、それらの一部が整数にバインドされているため、テキストを更新して 'マジック'が翻訳を処理できるようにしました。そうすれば、どんなテキストボックスでも一般的な解決策を得ることができます。私は、問題はこれであると信じて
private void FocusAndSelect(TextBox box)
{
box.SelectAll();
Dispatcher.BeginInvoke(DispatcherPriority.Input,
new Action(delegate()
{
box.Focus(); // Set Logical Focus
Keyboard.Focus(box); // Set Keyboard Focus
}));
}
サイドコメント:デリゲートをデリゲートのリストに追加することで元に戻すことができます。これにより、一部のプロパティ値を簡単に戻すことができます。次に、このデリゲートを単純呼び出ししてリストから削除します。 – Sinatr
@Sinatr、あなたはあなたが私に指し示すことができるものの例を持っていますか? – JLB