C# 如何将数据源绑定到不同类型的属性?

C# 如何将数据源绑定到不同类型的属性?,c#,winforms,C#,Winforms,在以下代码中: using System; using System.Collections.Generic; using System.Windows.Forms; namespace BindingSourceSimpleTest { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

在以下代码中:

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace BindingSourceSimpleTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public class Color
        {
            public string Name { get; set; }
            public int Red { get; set; }
            public int Green { get; set; }
            public int Blue { get; set; }
        }

        public class Obj
        {
            public string Name { get; set; }
            public string Color { get; set; }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var colors = new List<Color>();
            colors.Add(new Color { Name = "Black", Red = 0, Green = 0, Blue = 0 });
            colors.Add(new Color { Name = "Blue", Red = 0, Green = 0, Blue = 255 });
            colors.Add(new Color { Name = "Red", Red = 255, Green = 0, Blue = 0 });
            colors.Add(new Color { Name = "Magenta", Red = 255, Green = 0, Blue = 255 });
            colors.Add(new Color { Name = "Green", Red = 0, Green = 255, Blue = 0 });
            colors.Add(new Color { Name = "Cyan", Red = 0, Green = 255, Blue = 255 });
            colors.Add(new Color { Name = "Yellow", Red = 255, Green = 255, Blue = 0 });
            colors.Add(new Color { Name = "White", Red = 255, Green = 255, Blue = 255 });

            var objs = new List<Obj>();
            objs.Add(new Obj { Name = "Sun", Color = "Yellow" });
            objs.Add(new Obj { Name = "Grass", Color = "Green" });
            objs.Add(new Obj { Name = "Blood", Color = "Red" });
            objs.Add(new Obj { Name = "Sky", Color = "Blue" });
            objs.Add(new Obj { Name = "Hair", Color = "Black" });
            objs.Add(new Obj { Name = "Snow", Color = "White" });
            objs.Add(new Obj { Name = "Rose", Color = "Red" });

            listBoxObjs.DataSource = new BindingSource(objs, null);
            listBoxColors.DataSource = new BindingSource(colors, null);
            comboBoxObjColor.DataSource = new BindingSource(colors, null);

            textBoxObjName.DataBindings.Add("Text", listBoxObjs.DataSource, "Name");
            comboBoxObjColor.DataBindings.Add("SelectedItem", listBoxObjs.DataSource, "Color");
            textBoxColorName.DataBindings.Add("Text", listBoxColors.DataSource, "Name");
            textBoxColorRed.DataBindings.Add("Text", listBoxColors.DataSource, "Red");
            textBoxColorGreen.DataBindings.Add("Text", listBoxColors.DataSource, "Green");
            textBoxColorBlue.DataBindings.Add("Text", listBoxColors.DataSource, "Blue");

            listBoxObjs.DisplayMember = listBoxColors.DisplayMember = comboBoxObjColor.DisplayMember = "Name";
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Windows.Forms;
命名空间绑定SourceSimpleTest
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
公共类颜色
{
公共字符串名称{get;set;}
公共整数Red{get;set;}
公共整数绿色{get;set;}
公共整数蓝色{get;set;}
}
公共类Obj
{
公共字符串名称{get;set;}
公共字符串颜色{get;set;}
}
私有void Form1\u加载(对象发送方、事件参数e)
{
var colors=新列表();
添加(新颜色{Name=“Black”,红色=0,绿色=0,蓝色=0});
添加(新颜色{Name=“Blue”,红色=0,绿色=0,蓝色=255});
添加(新颜色{Name=“Red”,红色=255,绿色=0,蓝色=0});
添加(新颜色{Name=“洋红色”,红色=255,绿色=0,蓝色=255});
添加(新颜色{Name=“Green”,红色=0,绿色=255,蓝色=0});
添加(新颜色{Name=“Cyan”,红色=0,绿色=255,蓝色=255});
添加(新颜色{Name=“Yellow”,红色=255,绿色=255,蓝色=0});
添加(新颜色{Name=“白色”,红色=255,绿色=255,蓝色=255});
var objs=新列表();
添加(新的Obj{Name=“Sun”,Color=“Yellow”});
添加(新的Obj{Name=“Grass”,Color=“Green”});
添加(新的Obj{Name=“Blood”,Color=“Red”});
添加(新的Obj{Name=“Sky”,Color=“Blue”});
添加(新的Obj{Name=“Hair”,Color=“Black”});
添加(新的Obj{Name=“Snow”,Color=“White”});
添加(新的Obj{Name=“Rose”,Color=“Red”});
listBoxObjs.DataSource=newbindingsource(objs,null);
listBoxColors.DataSource=新的BindingSource(颜色,null);
comboBoxObjColor.DataSource=新的BindingSource(颜色,null);
textboxjname.DataBindings.Add(“Text”,listBoxObjs.DataSource,“Name”);
添加(“SelectedItem”,listBoxObjs.DataSource,“Color”);
textBoxColorName.DataBindings.Add(“Text”,listBoxColors.DataSource,“Name”);
textBoxColorRed.DataBindings.Add(“Text”,listBoxColors.DataSource,“Red”);
textBoxColorGreen.DataBindings.Add(“Text”,listBoxColors.DataSource,“Green”);
textBoxColorBlue.DataBindings.Add(“Text”,listBoxColors.DataSource,“Blue”);
listBoxObjs.DisplayMember=listBoxColors.DisplayMember=comboBoxObjColor.DisplayMember=“Name”;
}
}
}
以及以下表单UI:


(来源:)

  • 我看到太阳是黑的!为什么?在深入研究之后,我发现颜色列表中的项目是Color类型,而对象的Color属性是string类型
  • 如何使对象的颜色属性在中正确显示 组合框
  • 如果我解决了这个问题,更改组合框选择也会正确地更新对象的这个属性吗
  • 如果我解决了这个问题,太阳会变黄吗?:)
    谢谢

    您的Obj列表中似乎缺少对颜色对象的引用。它的颜色属性为字符串,但与颜色列表中的颜色对象没有关系

        public class Obj
        {
            public string Name { get; set; }
            public BindingSourceSimpleTest.Color Color { get; set; }
        }
    
    此外,类还应实现INotifyPropertyChanged接口,以便数据绑定正常工作:

    public class Obj : INotifyPropertyChanged {
      public event PropertyChangedEventHandler PropertyChanged;
    
      private string name;
      private BindingSourceSimpleTest.Color color;
    
      protected void OnPropertyChanged(string propName) {
        if (PropertyChanged != null) {
          PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
      }
    
      public string Name {
        get { return name; }
        set {
          name = value;
          OnPropertyChanged("Name");
        }
      }
    
      public BindingSourceSimpleTest.Color Color {
        get { return color; }
        set {
          color = value;
          OnPropertyChanged("Color");
        }
      }
    }