15

私の WPF アプリケーションには、ComboBoxItems の静的リストで満たされた ComboBox があります。その内容は変更されないためです。ただし、SelectedItem を基礎となる ViewModel にデータバインドしたいので、各 ComboBoxItem にも ViewModel プロパティに割り当てられる個別の値を持たせたいと考えています。そして、これを機能させるのに少し苦労しています。

私の ComboBox 宣言は次のようになります。

    <ComboBox Height="23" HorizontalAlignment="Stretch" Margin="2" Name="comboBox1" VerticalAlignment="Top"
              SelectedItem="{Binding Path=Amount, Mode=TwoWay}" SelectedValuePath="Tag" >
        <ComboBoxItem Content="None" Tag="0" />
        <ComboBoxItem Content="Few" Tag="1" />
        <ComboBoxItem Content="Some" Tag="2" />
        <ComboBoxItem Content="Enough" Tag="3" />
        <ComboBoxItem Content="Lots" Tag="4" />
        <ComboBoxItem Content="Too much" Tag="5" />
    </ComboBox>

この ComboBox の SelectedItem は、ViewModel の Amount プロパティにバインドされ、整数として宣言されます。

public class MyViewModel : INotifyPropertyChanged
{
    private int _amount = 3;

    public int Amount
    {
        get { return _amount; }
        set
        {
            _amount = value;
            OnPropertyChanged("Amount");
        }
    }

    //...
}

SelectedValuePath="Tag" が、Tag 値を使用して ViewModel の Amount プロパティにバインドする必要があることを WPF に通知することを望んでいましたが、このアプリケーションを実行して ComboBox の選択された項目を変更すると、デバッグ トレースで次のように通知されます。

System.Windows.Data Error: 23 : Cannot convert 'System.Windows.Controls.ComboBoxItem: Some' from type 'ComboBoxItem' to type 'System.Int32' for 'en-US' culture ...
System.Windows.Data Error: 7 : ConvertBack cannot convert value 'System.Windows.Controls.ComboBoxItem: Some' (type 'ComboBoxItem'). (...) System.NotSupportedException: Int32Converter cannot convert from System.Windows.Controls.ComboBoxItem.

どうやら、Tag 値だけでなく、ComboBoxItem 全体を ViewModel にバインドしようとしています。私は何を間違っていますか?

4

1 に答える 1

18

使用する場合は、 SelectedValueプロパティSelectedValuePathにバインドする必要があります。

SelectedValuePath を使用して取得した SelectedItem の値を取得または設定します

したがって、バインディングを次のように変更します

SelectedValue="{Binding Path=Amount, Mode=TwoWay}" 

あなたが経験したように、値ではなくSelectedItem実際に選択されたアイテム(あなたの場合は)が常に含まれるComboBoxItemためです。

于 2012-09-23T08:57:34.337 に答える