2009-09-12 8 views
1

コンボボックスに関する興味深いデータバインディングの質問があります。誰かが良い提案を持っていることを願っています。ComboBoxデータバインディングの質問

私はシンプルなフォームを持っています。ファイルピッカーとcomboxboxを含んでいます。ファイルが選択されるたびに、ファイルからListオブジェクトへの文字列のリストを読み込み、comboBox.DataSource = listOfStringsを設定します。

フォームのロードイベントでは、comboBox.DataBindings.Add( "SelectedItem"、myObject、 "PickedValue")を設定しました。

目的はっきりしています:コンボボックスから文字列を選択するたびに、その文字列をmyObject.PickedValueに書きたいと思います。

これはすべての話です。

私はフォームを起動します。ファイルを選択するのではなく、まずコンボボックスを確認します。もちろん、この時点で、comboBox.DataSourceはnull、comboBox.SelectedItemもnullです。しかし、comboBoxのデータバインディングはすでに設定されています(設定はフォームロードイベントになっています)。今では私の焦点をコンボボックスから他の場所に移動することはできません。

私はコンボボックスをチェックしようとすると、それはSelectedItemとしてnullがあると思います。フォーカスを別の場所に移動しようとすると、コンボボックスのデータバインディングがトリガーされます。基本的には、選択された項目を文字列に変換し、その変換された文字列でmyObject.PickedValueを更新しようとします。 nullを文字列に変換することはできないので、データバインディングの検証は失敗し、検証メカニズムではフォーカスを他の場所に移動することができず、この時点で私は吸っています。ファイルを選択することもできません。

私の質問は、このトラップを防ぐためのアプリケーションシナリオでの通常のバインディングセットアップの作業フローは何ですか?そのようなデータバインディングを設定する正しい順序は何ですか?データソースが何かで満たされる前にコンボボックスを確認できますか?

参考までに、コンボボックスのSelectedTextプロパティにmyObject.PickedValueをバインドしようとしました(SelectedTextがnullでないことに気づきました)。しかし興味深いことに、コンボボックスから何かを選択しても、データバインディングがトリガーされるとき、SelectedTextはまだ空文字列です。ここで何が間違っていますか?

ありがとうございました。

答えて

1

これは正しくないと思われます。文字列プロパティをnullに設定することは可能です。おそらくフォーカス問題は他の場所にあります。あなたの理論を確認するためにあなたのプロパティセッターにブレークポイントを設定しようとしましたか?

コンボボックスのSelectedTextプロパティは、コンボボックスのテキスト部分で選択されたテキストを参照します。これは、ドロップダウンスタイルがコンボに設定されている場合にのみ機能します。基本的には、コンボコントロールのテキストボックス部分の選択されたテキストです(コンボボックスとはコンボボックスとは、テキストボックスと選択リストの組み合わせであるためです)。ユーザーがコンボのテキスト部分を編集していない限り、通常はこのプロパティが空であると想定します。

この問題を回避するには、ユーザーエクスペリエンスが良好であることを確認してください。フォームロード時にコンボボックスを無効にしてから、ファイルを選択したときに有効にしてください。

+0

私に回避策を教えていただきありがとうございます。私はそれは準備ができているまで、コンボボックスを無効にするというアイデアは良いアイデアだと思います。 SelectedTextプロパティがなぜ私にとってうまくいかないのかを説明してくれてありがとう。私は答えとしてそれを取ると思う。 – Steve

3

エラーはあなたの説明より少しシンプルです:あなたのComboBoxは、選択する項目がないという理由だけで失敗します。何も選択できないからです。

選択するものがない場合は、ただComboBoxを無効にします。それはかなり簡単です。あなたのデータオブジェクトにPropertyChangedイベントをフックすることを忘れないでください。バインディングソースはそれを反映して自動的に見つけます。

class MyData 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    // ... 
    public HasListOfStrings { get { return ListOfStrings != null && 0 < ListOfStrings.Count; } } 

    private void LoadListOfStrings 
    { 
     // ... load the list of strings ... 

     if (PropertyChanged) { 
      PropertyChanged(this, "ListOfStrings"); 
      PropertyChanged(this, "HasListOfStrings"); 
     } 
    } 
} 

デザイナーでは、 'ComboBox'の 'Enabled'プロパティをHasListOfStringsプロパティにバインドします。私はまた、あなたがEnableAllowFocusChangeにコンテナ(またはコンテナのコンテナ)のAutoValidateプロパティを変更をお勧めします

listOfStringsComboBox.Bindings.Add ("Enabled", bindingSource, "HasListOfStrings"); 

:あなたがコードでそれを行うことができます。

+0

回避策はありがとうございます。このアイデアはPaulのものと似ていて、特にコードに感謝します。彼は私のSelectedTextの質問にも答えたので、答えとして彼を取った。しかし基本的にあなたのものは彼のものと同じくらい役に立ちます。乾杯。 – Steve

+0

うれしい私は助けることができました! – XXXXX

関連する問題