none
WPF ComboBox数据绑定问题 RRS feed

  • 问题

  • 程序中有个ComboBox,初始化时从数据库查询到了所以需要显示的列,并绑定到ComboBox(cbNameType.ItemsSource = GetNameTypeAll();),运行后下拉列表中显示了所以的列,这个没问题。

    然后还有个Grid ,Grid是ComboBox的父控件。每次操作时在代码中查询出一条数据记录并将记录数据赋值给Grid.DataContent,这样Grid中的子元素根据绑定Path就可以显示数据,但是ComboBox没有显示DataContent中绑定的对象。

    可能上面的描述不是很清楚,我举个例子:我有两个类 
    class Product
    {
    int ID;
    string Name;
    ProductType pdType;
    }

    class ProductType
    {
    int ID;
    string TypeName;
    }

    现在界面上有三个元素Grid ComboBox TextBox,Grid包含后两个。TextBox的绑定Text="{Binding Path=Name}" ,ComboBox 的绑定SelectedItem="{Binding Path=pdType}",ComboBox 显示属性DisplayMemberPath="TypeName"

    首先,程序初始化时从数据库获取所以ProductType,并将其绑定给ComboBox,
    List<ProductType> allPt= GetProductTypeAll();
    cbProductType.ItemsSource=allPt;
    这样ComboBox的下拉列表中就可以显示所以的ProductType类型数据。

    当从数据库获取一个Product对象的数据Product pt = GetProduct();并将其赋值给Grid的DataContent,gridProduct.DataContext = pt;
    这样TextBox可以显示pt对象中的Name属性,但是ComboBox没有按照预期的自动选择pdType对应allPt中的选项。

    小弟刚刚开始研究WPF关于绑定的东西,所以请各位帮忙解答一下疑惑
    2013年1月11日 3:00

答案

  • 通常有这些解决的方式:

    1. 把Product中的ProductType改成ProductId,并使用SelectedValuePath来解决这个问题。 把SelectedValuePath设为ID, 去掉SelectedItem的绑定,把SelectedValue设为{Binding Path=}

    2.重载ProductType的Equals方法,根据Id判断两个ProductType是否相等。 WPF的Selector根据Object.Equals方法来判断SelectedItem


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 blwuer 2013年1月15日 6:00
    2013年1月15日 5:19
    版主

全部回复

  • 我大概知道问题出在那儿了,使用Product pd = GetProduct();得到的pd.pdType在数据库中虽然是ProductType中的一项,也就是使用List<ProductType> allPt= GetProductTypeAll();获取的allPt中的一项,但是数据是分别从数据库中获取构建的,pd.pdType和allPt中的项之间没有直接的引用关系,因此WPF不认为pd.pdType是allPt中的一项,也就不会选中这项了。

    我做了个测试,直接构件List让他们之间有直接的引用关系我的问题就不存在了。可是实际操作中这是不够灵活也是相当不好的,请问这该怎么解决呢?

    2013年1月11日 7:54
  • 你这个做法是不正确的,你可以将TextBox直接绑定到ComboBox上去实现你想要的,或者把TextBox想要的信息设置到ComboBox的Tag属性上,然后Textbox从Tag属性去获得想要的值。另外,我觉得你自己的解决方案是可以的。


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2013年1月14日 10:20
    版主
  • 其实你没看懂我的问题

    2013年1月14日 13:22
  • 通常有这些解决的方式:

    1. 把Product中的ProductType改成ProductId,并使用SelectedValuePath来解决这个问题。 把SelectedValuePath设为ID, 去掉SelectedItem的绑定,把SelectedValue设为{Binding Path=}

    2.重载ProductType的Equals方法,根据Id判断两个ProductType是否相等。 WPF的Selector根据Object.Equals方法来判断SelectedItem


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    • 已标记为答案 blwuer 2013年1月15日 6:00
    2013年1月15日 5:19
    版主