2

问题:如何将 ComboBox 的 Selected 项绑定到一个属性,并将项列表绑定到另一个属性?


信息:

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

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

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

4

2 回答 2

1

你的方法没有错。ViewModel 可以公开来自 db 的类型集合以及绑定到所选项目的单独属性,例如:

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

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

就组合框为空而言

  • 启动应用程序时查看 VS 的输出窗口 - 是否有一行抱怨绑定失败?
  • 根据您的 xaml 绑定仔细检查您的属性的拼写
  • 在 AllShipments getter 上放置一个断点,以确保在 View 实例化绑定时它不为空。如果您在 VM 的构造函数中读取 db(如上),那么就可以了。

另外-如果您希望组合框显示装运对象中的用户,请记住确保您的虚拟机(或其基础)实现INotifyPropertyChanged,并在设置器中引发 PropertyChanged 事件SelectedShipment-这会将更改传播到视图通过数据绑定...

希望这可以帮助 :)

于 2010-01-03T02:23:01.083 回答
0

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

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

为了克服这个问题,您可能希望将用户绑定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();
        }
    }
}
于 2010-01-03T14:30:24.237 回答