簡體   English   中英

更新ListBox的BackColor

[英]Update BackColor for ListBox

我需要通過選擇組合框的顏色並單擊按鈕來更新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的BackColor,並且在單擊按鈕時單擊”,您根本不需要數據綁定。 你可以做到

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

如果您確實想通過數據綁定來做到這一點,則可以直接在列表框和組合框之間進行綁定(好吧,這不需要單擊按鈕):

listBox1.DataBindings.Add( "BackColor", comboBox1, "SelectedValue", true, DataSourceUpdateMode.OnPropertyChanged );

如果需要數據綁定和buttonclick,則可以將組合框與form.Current綁定。

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

這將導致集合中的兩個綁定綁定到同一屬性。 參數名稱:綁定

在您的代碼中,您已經在button的click事件處理程序中添加了數據綁定,並且每次您單擊代碼時都會執行。

要解決此問題,請將數據綁定代碼移動到窗體的Load事件。

如果出於任何原因要在按鈕的單擊事件中添加綁定,要解決該問題,可以檢查是否尚未添加綁定,然后添加綁定:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM