C# 更新列表框的背景色

C# 更新列表框的背景色,c#,winforms,binding,C#,Winforms,Binding,我需要通过从combobox中选择颜色并单击按钮来更新列表框的背景色。这是我的代码 public Data _current; public Data Current { get { return _current; } set { _current = value; if (PropertyChanged != null) {

我需要通过从combobox中选择颜色并单击按钮来更新列表框的背景色。这是我的代码

      public Data _current;
    public Data Current
    {
        get
        { return _current; }
        set
        {
            _current = value;

            if (PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("Current"));
            }
        }
    }
    public Form1()
    {
        InitializeComponent();
        Items = new ObservableCollection<Data>();
        for (int i = 0; i < names.Count; i++)
        {
            Items.Add(new Data() {Name=names[i].ToString().TrimStart(new char[] { '[', 'C', 'o', 'l', 'o', 'r', ' ', ']' }).TrimEnd(new char[] { ']' }), color = names[i] });
        }

        comboBox1.DataSource = Items;
        comboBox1.DisplayMember ="Name";
        Current = Items.First();

    }
    public List<Color> names = new List<Color>() { Color.Red,Color.Yellow,Color.Green,Color.Blue };

    public event PropertyChangedEventHandler PropertyChanged;
    private void button1_Click(object sender, EventArgs e)
    {
        Current = comboBox1.SelectedItem as Data;
        listBox1.DataBindings.Add("BackColor", Current, "color", true, DataSourceUpdateMode.OnPropertyChanged);
    }
    private void Form1_Load(object sender, EventArgs e)
    {
    }
}
public class Data:INotifyPropertyChanged
{
    private Color _color;

    public string name { get; set; }
    public string Name
    {
        get
        { return name; }
        set
        {
            name = value;
            if (PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("Name"));
            }
        }
    }
    public Color color
    {
        get
        {
            return _color;
        }
        set
        {
            _color = value;
            if (PropertyChanged != null)
            {
                this.PropertyChanged(this, new PropertyChangedEventArgs("color"));
            }
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}
公共数据\u当前;
公共数据流
{
得到
{返回_当前;}
设置
{
_电流=值;
if(PropertyChanged!=null)
{
this.PropertyChanged(此,新的PropertyChangedEventArgs(“当前”);
}
}
}
公共表格1()
{
初始化组件();
Items=新的ObservableCollection();
for(int i=0;i

异常弹出并显示:“这会导致集合中的两个绑定绑定到同一个属性。”

您只能绑定控件的任何属性一次,否则将收到
ArgumentException

这会导致集合中的两个绑定绑定到同一个 财产。参数名称:绑定

在代码中,您已经在按钮的click事件处理程序中添加了数据绑定,并且每次单击代码时都会执行

要解决此问题,请将数据绑定代码移动到表单的加载事件

如果出于任何原因,您希望在单击按钮事件中添加绑定,要解决此问题,您可以检查是否尚未添加绑定,然后添加绑定:

if (listBox1.DataBindings["BackColor"] == null)
    listBox1.DataBindings.Add("BackColor", Current, "color", true, 
        DataSourceUpdateMode.OnPropertyChanged);

您只能绑定控件的任何属性一次,否则将收到
ArgumentException

这会导致集合中的两个绑定绑定到同一个 财产。参数名称:绑定

在代码中,您已经在按钮的click事件处理程序中添加了数据绑定,并且每次单击代码时都会执行

要解决此问题,请将数据绑定代码移动到表单的加载事件

如果出于任何原因,您希望在单击按钮事件中添加绑定,要解决此问题,您可以检查是否尚未添加绑定,然后添加绑定:

if (listBox1.DataBindings["BackColor"] == null)
    listBox1.DataBindings.Add("BackColor", Current, "color", true, 
        DataSourceUpdateMode.OnPropertyChanged);

为了解决您最初的问题“我需要通过从combobox中选择颜色并单击按钮来更新列表框的背景色”,您根本不需要数据绑定。你可以用它来做

private void button1_Click( object sender, EventArgs e )
{
    listBox1.BackColor = (Color)comboBox1.SelectedValue;
}
如果您确实想使用数据绑定,可以直接在listbox和combobox之间进行绑定(好的,这不需要单击按钮):

如果需要数据绑定和按钮单击,可以将combobox与form.Current绑定

comboBox1.DataBindings.Add( "SelectedItem", this, "Current", true, DataSourceUpdateMode.OnPropertyChanged );
并在单击按钮时更新背景色:

listBox1.DataBindings.Add( "BackColor", comboBox1, "SelectedValue", true, DataSourceUpdateMode.OnPropertyChanged );
private void button1_Click( object sender, EventArgs e )
{
    listBox1.BackColor = Current.Color;
}
以下是包含更多改进的完整示例:

public class Data : INotifyPropertyChanged
{
    public string Name
    {
        get { return color.Name; }
    }

    private Color color;
    public Color Color
    {
        get { return color; }
        set
        {
            color = value;

            if( PropertyChanged != null )
                this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

public class Form1 : Form
{
    private ComboBox comboBox1;
    private ListBox listBox1;
    private Button button1;

    public Form1()
    {
        InitializeComponent();

        List<Data> dataList = new List<Data>
        {
            new Data { Color = Color.Red },
            new Data { Color = Color.Yellow },
            new Data { Color = Color.Green },
            new Data { Color = Color.Blue },
        };

        comboBox1.DataSource = dataList;
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Color";
    }

    public Data Current
    {
        get { return comboBox1.SelectedItem as Data; }
    }

    private void button1_Click( object sender, EventArgs e )
    {
        listBox1.BackColor = Current.Color;
    }

    private void InitializeComponent()
    {
        //...
    }
}
公共类数据:INotifyPropertyChanged
{
公共字符串名
{
获取{return color.Name;}
}
私人色彩;
公共颜色
{
获取{返回颜色;}
设置
{
颜色=值;
if(PropertyChanged!=null)
this.PropertyChanged(这是新的PropertyChangedEventArgs(“颜色”));
}
}
公共事件属性更改事件处理程序属性更改;
}
公开课表格1:表格
{
专用组合框组合框1;
私有列表框列表框1;
私人按钮1;
公共表格1()
{
初始化组件();
列表数据列表=新列表
{
新数据{Color=Color.Red},
新数据{Color=Color.Yellow},
新数据{Color=Color.Green},
新数据{Color=Color.Blue},
};
comboBox1.DataSource=数据列表;
comboBox1.DisplayMember=“Name”;
comboBox1.ValueMember=“Color”;
}
公共数据流
{
获取{return comboBox1.SelectedItem作为数据;}
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
listBox1.BackColor=Current.Color;
}
私有void InitializeComponent()
{
//...
}
}

为了解决您的原始问题,“我需要通过从combobox中选择颜色并单击按钮来更新列表框的背景色”,您根本不需要数据绑定。你可以用它来做

private void button1_Click( object sender, EventArgs e )
{
    listBox1.BackColor = (Color)comboBox1.SelectedValue;
}
如果您确实想使用数据绑定,可以直接在listbox和combobox之间进行绑定(好的,这不需要单击按钮):

如果需要数据绑定和按钮单击,可以将combobox与form.Current绑定

comboBox1.DataBindings.Add( "SelectedItem", this, "Current", true, DataSourceUpdateMode.OnPropertyChanged );
并在单击按钮时更新背景色:

listBox1.DataBindings.Add( "BackColor", comboBox1, "SelectedValue", true, DataSourceUpdateMode.OnPropertyChanged );
private void button1_Click( object sender, EventArgs e )
{
    listBox1.BackColor = Current.Color;
}
以下是包含更多改进的完整示例:

public class Data : INotifyPropertyChanged
{
    public string Name
    {
        get { return color.Name; }
    }

    private Color color;
    public Color Color
    {
        get { return color; }
        set
        {
            color = value;

            if( PropertyChanged != null )
                this.PropertyChanged( this, new PropertyChangedEventArgs( "Color" ) );
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

public class Form1 : Form
{
    private ComboBox comboBox1;
    private ListBox listBox1;
    private Button button1;

    public Form1()
    {
        InitializeComponent();

        List<Data> dataList = new List<Data>
        {
            new Data { Color = Color.Red },
            new Data { Color = Color.Yellow },
            new Data { Color = Color.Green },
            new Data { Color = Color.Blue },
        };

        comboBox1.DataSource = dataList;
        comboBox1.DisplayMember = "Name";
        comboBox1.ValueMember = "Color";
    }

    public Data Current
    {
        get { return comboBox1.SelectedItem as Data; }
    }

    private void button1_Click( object sender, EventArgs e )
    {
        listBox1.BackColor = Current.Color;
    }

    private void InitializeComponent()
    {
        //...
    }
}
公共类数据:INotifyPropertyChanged
{
公共字符串名
{
获取{return color.Name;}
}
私人公司