hoe een gegevensbron aan een ander type-eigenschap te binden?

in de volgende code:

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

en de volgende vorm UI:

Form1 http://hamidi2.persiangig.com/image/910404_BindingSourceSimpleTest_UI.png

  1. ik zie dat de zon zwart is! waarom?! na een diepere blik vond ik dat de items in de lijst met kleuren van het type Kleur zijn, terwijl de eigenschap Color van een object van het type string is.
  2. hoe kan ik de eigenschap Color van een object correct weergeven in de combobox?
  3. als ik dit repareer, wordt bij het wijzigen van de combobox-selectie deze eigenschap van een object ook correct bijgewerkt?
  4. als ik dit oplost, wordt de zon geel? :)

bedankt

1

1 antwoord

Het lijkt erop dat u een verwijzing naar uw kleurobject mist in uw Obj-lijst. Het heeft een kleureigenschap die een tekenreeks is, maar er is geen relatie met de kleurobjecten in de lijst Kleur.

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

Ook moeten uw klassen de INotifyPropertyChanged-interface implementeren om de databinding correct te laten werken:

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");
    }
  }
}
0
toegevoegd