将组合框的选定项和项列表绑定到wpf中的不同属性

时间:2010-01-03 01:12:31

标签: wpf data-binding combobox selecteditem

问题:如何将ComboBox的Selected项目的绑定设置为一个属性,将项目列表设置为另一个属性?


的信息:

我有一个我正在为我的公司工作的库存计划,主要针对那些接收货物的人。我设置了一些东西,以便在屏幕的一侧有一个货件清单。当他们选择其中一个时,显示货件上的所有信息,以便进行编辑。一点信息是收到货物的人。我想要它,以便当他们点击货物时,显然收到货物的用户是在组合框中弹出的用户。但我希望组合框包含所有其他用户的列表。

如果不是因为我从数据库中提取用户列表这一点,那就不难了。列表框有一个数据模板,用于从用户数据类型列表中提取适当的信息。我到目前为止所尝试的是在视图模型中有一个集合视图,组合框为其列表绑定,然后是一个单独的属性,它是一个附带出货数据类型的单个用户实例。

我正在根据M-V-VM编程模型在Visual Basic和XAML中编程。

2 个答案:

答案 0 :(得分:1)

你的方法没有错。 ViewModel可以公开db中的一组类型,以及绑定到所选项的单独属性,如:

public ObservableCollection<Shipment> AllShipments { get; private set; }
public Shipment SelectedShipment { get; set; }

// Constructor
public MyViewModel()
{
    AllShipments = ReadFromDb();
}

就组合框是空的而言

  • 在启动应用程序时,请查看VS中的输出窗口 - 是否有人抱怨绑定失败?
  • 根据您的xaml Binding
  • 仔细检查您的媒体资源的拼写
  • 在AllShipments getter上放置一个断点,以确保在View实例化绑定时它不为null。如果您在VM的构造函数中读取数据库(如上所示),那么这将是正常的。

此外 - 如果您希望组合框显示出货对象中的用户,请记住确保您的VM(或其基础)实现INotifyPropertyChanged,并在SelectedShipment中引发PropertyChanged事件setter - 这会通过DataBinding将更改传播到View ...

希望这有助于:)

答案 1 :(得分:0)

假设您正在使用Linq-to-SQL,我将回答这个问题:

这是一个常见的PITA问题,User对象中的Shipment属性包含对User对象的引用,该引用与User对象不同填充ComboBox的查询,即使它们代表相同的记录。

要解决此问题,您可能希望将用户ComboBox绑定到与DataContext列表相同的Shipments检索到的用户列表。

示例:

class ViewModel
{
    public List<User> Users { get; set; }
    public List<Shipment> Shipments { get; set; }
    public Shipment SelectedShipment { get; set; }

    public void ReadShipments()
    {
        using (var dc = new MyDataContext())
        {
            DataLoadOptions dlo = new DataLoadOptions();
            dlo.LoadWith<Shipment>(x => x.User);
            dc.LoadOptions = dlo;
            Shipments = dc.Shipments.ToList();
            Users = dc.Users.ToList();
        }
    }
}