更新ListBox的背景色
本文关键字:背景色 ListBox 更新 | 更新日期: 2023-09-27 18:12:15
我需要更新我的ListBox的BackColor通过选择从组合框的颜色,当点击按钮。这是我的代码
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;
}
异常弹出并说:"这会导致集合中的两个绑定绑定到同一属性。"
为了解决你原来的问题"我需要更新我的ListBox的背景颜色从组合框中选择的颜色,当点击按钮",你不需要数据绑定在所有。你可以直接用
private void button1_Click( object sender, EventArgs e )
{
listBox1.BackColor = (Color)comboBox1.SelectedValue;
}
如果你真的想用数据绑定来做,你可以直接在列表框和组合框之间绑定(好吧,这不需要点击按钮):
listBox1.DataBindings.Add( "BackColor", comboBox1, "SelectedValue", true, DataSourceUpdateMode.OnPropertyChanged );
如果你需要数据绑定和按钮点击,你可以绑定组合框与表单。当前
comboBox1.DataBindings.Add( "SelectedItem", this, "Current", 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()
{
//...
}
}
您只能绑定一次控件的任何属性,否则您将收到ArgumentException
:
这会导致集合中的两个绑定绑定到相同的绑定财产。参数名称:binding
在你的代码中,你在按钮的点击事件处理程序中添加了数据绑定,每次点击代码都执行。
要解决这个问题,将数据绑定代码移动到Load事件的表单。
如果出于任何原因你想在click event of button中添加绑定,为了解决这个问题,你可以检查绑定是否没有添加,然后添加绑定:
if (listBox1.DataBindings["BackColor"] == null)
listBox1.DataBindings.Add("BackColor", Current, "color", true,
DataSourceUpdateMode.OnPropertyChanged);