【问题标题】:Binding a combobox's selected item and items list to different properties in wpf将组合框的选定项目和项目列表绑定到 wpf 中的不同属性
【发布时间】:2010-12-31 21:40:00
【问题描述】:

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


信息:

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

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

我正在根据 M-V-VM 编程模型使用 Visual Basic 和 XAML 进行编程。

【问题讨论】:

    标签: wpf data-binding combobox selecteditem


    【解决方案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(如上),那么就可以了。

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

    希望这会有所帮助:)

    【讨论】:

    • 原来它没有填充的原因是我在 LINQ 语句之后错过了一个 .ToList 。所以现在效果很好而且花花公子。但是我仍然没有让我的货件的用户正确绑定。我已经实现了 INotify,但它仍然不起作用。还有什么建议吗?
    • 我在ianrandallonwpf.wordpress.com 上写了一个关于如何创建真正简单 主从控件的简短系列博客。它使用 ListBox,但您可以轻松地将其换成 ComboBox... HTH :)
    • 我已经这样做了。我的代码设置为在屏幕左侧有一个列表框。您选择 Shipment,然后右侧的内容演示者会显示相关数据。在那个内容展示器里面是我的麻烦一些组合框。问题似乎在于它是细节而不是主人。组合框绑定到我想要的用户列表,但我希望所选用户成为程序从数据库加载的用户。
    • 这不是我要找的答案,但它足够接近我希望能帮助任何偶然发现这个线程的人。我最终只是将 GUID 传递给一个转换器,该转换器在数据库中查询与该 GUID 关联的名称并显示该名称。无论如何感谢您的帮助。
    【解决方案2】:

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

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

    要克服这个问题,您可能希望将用户 ComboBox 绑定到从与 Shipments 列表相同的 DataContext 检索到的用户列表。

    例子:

    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();
            }
        }
    }
    

    【讨论】:

    • 原来没有填充的框是一个 id10t 错误。我在 LINQ 语句的末尾忘记了 .ToList ... \n 无论如何,列表框已填充,但我仍然无法将所选用户设置为发货中的用户。我尝试在你给我的 C# 上使用我的代码翻译器,但它在 VB 中没有任何意义。我在课程开始时将数据上下文变暗,因此两者使用的上下文相同。但我不明白这到底有什么不同。 \n 对我使用 LINQ 的猜测不错。
    • 您是否使用与查询货件相同的数据上下文填充组合?
    • 仔细检查,没有。我正在从 shippingVM 内部加载用户。这是我用于装运托盘的方法,效果很好,所以我正在回收。我应该加载用户并通过 AllShipmentsVM 传递对它的引用吗?
    • 我正在尝试让您的 dlo 东西基本正常工作。有些事情我在翻译时遇到了问题。 thatx => x.User 在哪里发挥作用?
    • 所以我已经让用户组合框来填充,我现在遇到的问题是让它绑定到当前对象。我需要组合框来显示当前货件的用户,当输入货件的人更改用户时,新的用户是与该货件一起保存到数据库中的用户。如果我能做到这一点,一切都很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 2013-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多