私はMVVMパターンを使用してアプリケーションをビルドしています。このコンボボックスの項目を収集WPF:変更後にコンボボックスをリセットする
<ComboBox ItemsSource="{Binding Path=Persons, Mode=OneTime}"
SelectedValue="{Binding Path=SelectedPerson, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
最初として「指示テキスト」で初期化されます。このアプリケーションでは、私はアイテムのcolletionに、選択した項目を含むプロパティにバインドされたコンボボックスを持っています項目、その後、通常のアイテムの束:
Persons.Add("Open Person...");
Persons.Add("Anders Andersson");
Persons.Add("Bengt Bengtsson");
Persons.Add("Carl Carlsson");
Persons.Add("Daniel Danielsson");
私はこのコンボボックスを持っているしたい行動は、それが最初に(これはもちろん、容易に達成さ)命令テキストを示すことです。ユーザーがComboBoxで人を選択すると、アプリケーションは何らかのアクション(選択された人物を開く)を行い、その後、指示テキストにリセットされます。ユーザーがコンボボックス内の命令文よりも、何を選択したときに
がprivate string _selectedPerson = "Open Person...";
public string SelectedPerson
{
get
{
return _selectedPerson;
}
set
{
if (value != _selectedPerson)
{
OpenPerson(value);
OnPropertyChanged("SelectedPerson");
}
}
}
私の考えは、OpenPersonは()になりましたこと:
としては、最初に選択した項目のためのこの特性を有することで、これは簡単だろうと思いました選択した値で呼び出されますが、選択した値はプライベートフィールド(_selectedPerson)には格納されません。次に、ComboBoxがプロパティSelectedPersonの値を読み込み、それ自身(SelectedValue)を更新するPropertyChangedイベントをトリガーします。 _seletedPersonフィールドはまだ命令テキストであるため、ComboBoxはそれ自体にリセットされます。
これは機能しません。
実際、すべてが期待どおりになるようです。 rightPerson()がrightパラメータで呼び出され、PropertyChangedイベントがトリガされます。ただし、ComboBoxで示される値を変更するGUIの動作は、実際にはすべてこの後に実行されます。これは、SelectedPersonを何に設定したとしても、ComboBoxはGUIで選択された項目を表示することを意味します。
これを回避するための優雅な方法はありますか?
実際に、私はこれを自分自身で知りました。しかし、それはCodeBehindのコード、ViewModelの2つのフラグ、SelectedPersonプロパティのいくつかの厄介なコードを含んでいました。ソリューションは、まあ、言い表せないほど満足できるものではありません...;)だから、私より賢い誰かがより良い解決策を思いつくことを望んでいました! :)
もちろんです! SelectionChangedハンドラを使用するのが最も簡単なソリューションです。 ViewModelでこれをどうやってやっているかについて、私は決して考えていませんでした。確かに、上記のソリューションがうまくいけばコードの背後にコードは必要なくなるはずですが、明らかにそうではありません。ありがとうIngó! :) – haagel