在我的 WPF 应用程序中,我有一个 ComboBox,其中填充了 ComboBoxItems 的静态列表,因为它的内容永远不会改变。但是,因为我想将 SelectedItem 数据绑定(bind)到我的底层 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 绑定(bind)到 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 值绑定(bind)到 ViewModel 的 Amount 属性,但是当我运行这个应用程序并更改 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.
显然,它试图将整个 ComboBoxItem 绑定(bind)到我的 ViewModel,而不仅仅是它的 Tag 值。 我做错了什么?
最佳答案
如果您使用 SelectedValuePath
,那么您需要绑定(bind)到 SelectedValue属性是
Gets or sets the value of the SelectedItem, obtained by using SelectedValuePath
所以修改你的绑定(bind)到
SelectedValue="{Binding Path=Amount, Mode=TwoWay}"
因为根据您的经验,SelectedItem
将始终包含实际选择的项目(在您的情况下为 ComboBoxItem
)而不是值。
关于c# - WPF ComboBox : static list of ComboBoxItems, 但数据绑定(bind) SelectedItem?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12550926/