简单的状态消息实现

时间:2013-05-07 13:29:35

标签: c# wpf winforms class properties

我正在尝试创建基本类,它允许不同的控件绑定并显示一些值。

我想拥有静态的对象列表,其中每个对象都有一些属性,如caption,ticks counter等等。

然后我想将标签绑定到此列表的最后添加项目和datagridview以允许查看所有这些项目。

如果这样的解决方案适用于winforms和wpf环境,那将会很棒。

如果你能指出我做错了什么。感谢。

下面的想法草案(许多已经测试过的和失败的一个)。

状态类:

public class Status: INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }

    //implementation of observable collection
    private static ObservableCollection<Status> _list;
    public static ObservableCollection<Status> List
    {
        get { return _list ?? (_list = new ObservableCollection<Status>{new Status()}); }
    }

    //object properties
    public string Message { get; set; }
    public bool Finished { get; set; }

    //object views
    public string View
    {
        get { return Message + "(" + Finished + ")" ; }
    }

    //object methods
    public static Status Add(string message)
    {
        var result = new Status
        {
            Message = message,
            Finished = false
        };

        List.Add(result);
        return result;
    }

    public void Finish()
    {
        Finished = true;
    }
}

形式:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        label1.DataBindings.Add("Text", Status.List, "Message");
        listBox1.DisplayMember = "View";
        listBox1.DataSource = Status.List;
    }

    private void Button1_Click(object sender, EventArgs e)
    {
        label5.Text  = Status.Add(textBox1.Text).Message;
        textBox1.Text = "";
    }

    private void Button2_Click(object sender, EventArgs e)
    {
        ((Status)listBox1.SelectedItem).Finish();
    }
}

1 个答案:

答案 0 :(得分:0)

这就是诀窍:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Linq;
using System.Runtime.CompilerServices;
using WindowsFormsApplication2.Annotations;

namespace WindowsFormsApplication2
{

public class Item : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    #region Notyfier implementation
    [NotifyPropertyChangedInvocator]
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    #endregion

    #region collection implemetation

    public BindingList<Item> Items = new BindingList<Item>();

    public string Count
    {
        get { return (Items.Count == 1) 
            ? "1 item." 
            : Items.Count + " items."; }
    }

    public Item Current
    {
        get { return Items.Count == 0 
            ? new Item {Colour = Color.Chartreuse} //default initial item
            : Items.Last(); }
    }
    #endregion

    #region object implemetation

    protected object ID { get; set; }
    public Color Colour { get; set; }

    public void NewItem(Color color)
    {
        Items.Add(new Item
            {
                ID = Guid.NewGuid(), 
                Colour = color
            });

        OnPropertyChanged("Count");
        OnPropertyChanged("Current");
    }

    #endregion
}
}