c# - WinForms 中的下拉绑定(bind)

标签 c# .net winforms data-binding

想象一下这两个类:

class Part
{
 public string Name { get; set;}
 public int Id { get; set; }
}

class MainClass
{
 public Part APart { get; set;}
}

如何将 MainClass 绑定(bind)到 WinForm 上的组合框,以便它显示 Part.Name (DisplayMember = "Name";) 并且组合的选定项设置MainClass 无需处理下拉列表中的任何事件。

据我所知,将 ComboBox 的 ValueMember 设置为“Id”意味着它将尝试将 APart 设置为不正确的数字 (Id)。

希望这已经够清楚了!

最佳答案

您正在寻找的是 ValueMember (= ComboBox.SelectedItem ) 是对对象本身的引用,而 DisplayMember是项目的单一属性,对吗?据我所知,如果不创建自己的 ComboBox,就没有好的方法可以做到这一点。并自己进行绑定(bind),由于方式 ValueMemberDisplayMember工作。

但是,这里有一些您可以尝试的事情(假设您在某处有一个 Part 的集合):

  1. 覆盖 `Part` 的 `ToString()` 方法以返回 `Name` 属性。然后将 `ComboBox` 的 `ValueMember` 设置为 `"APart"` 并将 `DisplayMember` 留空。 (未经测试,因此无法保证)
  2. 您可以在 Part 中创建一个新属性以返回对自身的引用。将“ValueMember”设置为新属性,将“DisplayMember”设置为“Name”。这可能感觉有点像 hack,但它应该有效。
  3. 用你的 `APart` getter 和 setter 做一些有趣的事情。您将失去一些强类型,但如果您将 `APart` 设为对象并且 `MainClass` 包含 `Part` 的集合,您可以通过 `Id` (`int`) 或 `Part` 设置它。 (显然,当您将 ComboBox 绑定(bind)到它时,您会希望通过 Id 来设置它。)
Part _APart;
object APart 
{ 
    get {return _APart;}
    set {
        if(value is int)
            _APart = MyPartCollection.Where(p=>p.Id==value).Single();
        else if(value is Part)
            _APart = value;
        else
            throw new ArgumentException("Invalid type for APart");
    }
}

关于c# - WinForms 中的下拉绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/696864/

相关文章:

c# - 货币格式: Remove insignificant Zeros

c# - 如何解压 Fody.Costura 打包程序集

c# - 使用 MEF 时是否有任何 Prism "Post-build"事件或方法?

c# - .Net 4.0 System.Web.Security.MembershipProvider 引用不明确?

c# - 绘制多个没有重叠文本的字符串

c# - 使用 Linq to SQL 为 objectContext 过滤查询

c# - 在 Dynamics crm 中获取用户的上下文

c# - 使用动态设置不受控制的(第三方)密封类型的不同属性

c# - 如何处理可能需要很长时间才能启动的启动/停止API接口(interface)

c# - CheckedListBox 中没有 ItemChecked 事件?