2011-01-07 13 views
1

私は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プロパティのいくつかの厄介なコードを含んでいました。ソリューションは、まあ、言い表せないほど満足できるものではありません...;)だから、私より賢い誰かがより良い解決策を思いつくことを望んでいました! :)

答えて

1

Combobox用のSelectionChangedハンドラを作成し、代わりに "Open Person ..."に戻してみましたか?

また、インデックスを0に設定するコンボボックスのトリガーもありますか?

+0

もちろんです! SelectionChangedハンドラを使用するのが最も簡単なソリューションです。 ViewModelでこれをどうやってやっているかについて、私は決して考えていませんでした。確かに、上記のソリューションがうまくいけばコードの背後にコードは必要なくなるはずですが、明らかにそうではありません。ありがとうIngó! :) – haagel

0

私はこれで何か他のものを探していましたが、私はまだ助けてくれることを願っています。

私はselectchangedイベントにコマンドをバインドします。そのコマンドはViewmodelで定義され、MVVMパターン(コードビハインドなし)に従います。

あなたがブレンド対話の参照が含まれ、以下を含める必要があるので、私はMVVM-ライトフレームワークを使用します。

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity" 
xmlns:cmd="http://www.galasoft.ch/mvvmlight" 

次は私が私のXAMLでそれを宣言する方法です:

  <ComboBox Name="idClient" Grid.Column="1" Grid.ColumnSpan="2" Grid.Row="2" 
           Style="{StaticResource FTC_DetailComboBox}" 
           ItemsSource="{Binding ClientViewSource.View}" 
           SelectedItem="{Binding client}" 
           SelectedValuePath="idClient" 
           SelectedValue="{Binding idClient, Mode=TwoWay, ValidatesOnDataErrors=True}" 
           DisplayMemberPath="chrCompany" 
           > 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
         <cmd:EventToCommand Command="{Binding LostFocusValidateCommand}" CommandParameter="idStatus"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </ComboBox> 

ここで私のviewmodel(vb.net)のコードです。RelayCommandはICommandの簡単な実装です

Private _LostFocusValidateCommand As RelayCommand(Of String) 

    Public ReadOnly Property LostFocusValidateCommand() As RelayCommand(Of String) 
     Get 
      If _LostFocusValidateCommand Is Nothing Then 
       _LostFocusValidateCommand = New RelayCommand(Of String)(AddressOf LostFocusValidateExecute) 
      End If 
      Return _LostFocusValidateCommand 
     End Get 
    End Property 

    Private Sub LostFocusValidateExecute(sParam As String) 
     ''perform commands here 
    End Sub 
関連する問題