5

Datagrid があり、選択した行をダブルクリックすると、編集画面が起動します。この編集画面には、グリッドで選択された行に値がバインドされたコンボボックスがあります。コンボボックスに割り当てられた値がコンボボックス itemSource に存在しない場合があるため、コンボボックスの表示は空ですが、値は null ではありません。itemsource コレクションに値が存在しない場合、選択したアイテムの値を null に更新するにはどうすればよいですか。

上記のシナリオでは、2 番目の画面が最初の画面の Selected アイテムにバインドされているため、City の SelectedValue は「ロサンゼルス」で、Display は空です。ただし、「ロサンゼルス」はコレクションに存在しないため、SelectedValue は null である必要があります。

4

2 に答える 2

1

解決策は、コンボボックスのItemsSourceをリスト (例: "DeviceNameList") に設定し、このコンボボックスのSelectedItemをリスト内の要素のタイプに一致する変数 (SelectedDeviceName) に設定することです。

編集画面をロードすると、リストがコンボボックスにバインドされ、設定した変数が表示されます。

選択した項目がリストにあるかどうかを確認するコードを作成する必要があります。そうでない場合は、値をゼロに設定できます。

例:

XAML コード:

<ComboBox ItemsSource="{Binding Path=DeviceNameList}" SelectedItem="{Binding Path=SelectedDeviceName}" />

selectedItem を設定するコード:

    /// <summary>
    /// Gets or sets SelectedDeviceName.
    /// </summary>
    public ObservableCollection<string> DeviceNameList
    {
         get
        {
           return mDeviceNameList;
        }

        set
        {
            mDeviceNameList = value;
        }
    }

    /// <summary>
    /// Gets or sets SelectedDeviceName.
    /// </summary>
    public string SelectedDeviceName
    {
        get
        {
            return mSelectedDeviceName;
        }

        set
        {
            mSelectedDeviceName = value;
            NotifyPropertyChanged("SelectedDeviceName");
        }
    }

    /// <summary>
    /// Event PropertyChanged
    /// </summary>
    public event PropertyChangedEventHandler PropertyChanged;


        /// <summary>
    /// Function NotifyPropertyChanged
    /// </summary>
    /// <param name="property">
    /// The property.
    /// </param>
    private void NotifyPropertyChanged(string property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }
于 2013-04-22T13:46:32.520 に答える
0

コンバーターは、バインディング内のデータを目的の結果に変換するために使用されます。(互換性のない型をソースとターゲット間で一致させることができます)。

コンボボックスとアイテムソースの間で使用されるコンバーターに関する同様の質問は次のとおりです。

コンボボックスのバインドされたアイテムでコンバーターを使用する

また、一般的なコンバーターについては、次の場所で詳しく読むことができます。

http://wpftutorial.net/ValueConverters.html

この場合、コンバーターはコンボの selectedItem プロパティに配置する必要があります。

編集:

コードのサンプルで少し遊んで、コンボ ボックスの選択変更イベントに登録しました。このイベントは、選択項目のソースがコンボ ボックスに有効な選択を生成する場合にのみトリガーされます。だから今、私はうまくいくはずの元の提案に戻ります: コンバーターで、コンボボックス項目のすべての値のリストに対して入力値を確認します。存在しない場合、コンバーターは、選択した項目を null に設定する必要があることをコンボに通知する必要があります。これを行うにはもっとシンプルでエレガントな方法があると確信していますが (私は WPF の専門家ではありません)、これでうまくいくはずです。

コントロールでコンバーターをフックする方法に関する別のリードは、マルチバインディングを使用しています。

WPF コンバーターは、バインドされているコントロールにアクセスできますか?

于 2013-04-22T13:30:46.653 に答える