wpf组合框SelectedValue获取类名而不是属性

时间:2016-04-25 18:26:20

标签: c# wpf xaml data-binding

<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')

2 个答案:

答案 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没有被覆盖,则返回类名。