WPF ComboBox:ComboBoxItems的静态列表,但是数据绑定SelectedItem?

时间:2012-09-23 08:49:24

标签: c# wpf data-binding combobox

在我的WPF应用程序中,我有一个ComboBox,它充满了ComboBoxItems的静态列表,因为它的内容永远不会改变。但是,因为我想将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”告诉WPF它应该使用Tag值绑定到ViewModel的Amount属性,但是当我运行这个应用程序并更改ComboBox的选定项时,调试跟踪告诉我:< / p>

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.

显然,它尝试将整个ComboBoxItem绑定到我的ViewModel,而不仅仅是它的Tag值。 我做错了什么?

1 个答案:

答案 0 :(得分:16)

如果您使用SelectedValuePath,则需要绑定到SelectedValue属性

  

获取或设置通过使用SelectedValuePath

获得的SelectedItem的值

所以修改你的绑定

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

因为您经历过SelectedItem将始终包含实际选定的项目(在您的情况下为ComboBoxItem)而不是值。