<ComboBox
x:Name="comboBox"
Margin="281.4,160,259.995,159.958"
d:LayoutOverrides="Height"
ItemsSource="{Binding _US_STATES}"
SelectedIndex="0"
SelectedValue="{Binding SelectedState}"
SelectedValuePath="{Binding Path=_US_STATES/SHORT}"
>
<ComboBox.ItemTemplate>
<DataTemplate>
<Border Padding="2">
<TextBlock Text="{Binding LONG}" />
</Border>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
以上是我正在显示的ComboBox的xaml版本。我可以正确显示它,因为它显示了正确的数据。当我尝试获取它所选择的值时,它始终是RxTracking.model.US_STATES而不是它应该的值。
US_STATES看起来像这样:
public class US_STATES : ObservableObject
{
private string _long;
private string _short;
public string LONG
{
get { return _long; }
set { Set("LONG", ref _long, value); }
}
public string SHORT
{
get { return _short; }
set { Set("SHORT", ref _short, value); }
}
public static ObservableCollection<US_STATES> GetAllStates()
{
ObservableCollection<US_STATES> ALL = new ObservableCollection<US_STATES>
{
new US_STATES {LONG="ALABAMA",SHORT="AL" },
new US_STATES {LONG="Alaska", SHORT = "AK"},
new US_STATES {LONG = "Arizona", SHORT = "AZ"},
etc ...
我得到的是错误窗口:
System.Windows.Data Error: 40 : BindingExpression path error: 'AL' property not found on 'object' ''US_STATES' (HashCode=8402670)'. BindingExpression:Path=AL; DataItem='US_STATES' (HashCode=8402670); target element is 'ComboBox' (Name='comboBox'); target property is 'NoTarget' (type 'Object')
System.Windows.Data Error: 40 : BindingExpression path error: 'AL' property not found on 'object' ''US_STATES' (HashCode=15232780)'. BindingExpression:Path=AL; DataItem='US_STATES' (HashCode=15232780); target element is 'ComboBox' (Name='comboBox'); target property is 'NoTarget' (type 'Object')
答案 0 :(得分:1)
SelectedValuePath
属性是一个字符串。它应该是您要用于所选值的列表项类的属性的名称。
如果您想使用SHORT
的{{1}}属性,那很简单:
US_STATES
这就是为什么它对SelectedValuePath="SHORT"
感到哭泣和哀嚎:绑定更新了'AL' property not found on 'object' ''US_STATES'
,其值为SelectedValuePath
(这是“当前项目”,它使用的第一个来自_US_STATES/SHORT
{1}}没有ObservableCollection
属性 - 进入CollectionViewSource和ICollectionView,你不需要担心,除非你在XAML中排序或过滤东西),这是“AL” 。因此,CurrentItem
尽职尽责地找到ComboBox
的{{1}}属性,该属性不存在。
顺便说一下,您可以省去编写模板的麻烦,只需设置AL
:
US_STATES
答案 1 :(得分:0)
您需要在组合框中设置显示值属性或覆盖States类中的ToString。
发生的事情是组合框在存储在其中的对象上调用ToString,如果ToString没有被覆盖,则返回类名。