3

Winforms .net 3.5 应用程序。在我的应用程序中,我有一个看起来像这样的通用类:

public class FilterItem {
  public FilterItem() { }
  public string FilterProperty { get; set; }
  public bool FilterPropertyChecked { get; set; }
  public ComparitiveOperator FilterOperator { get; set; }
  public string FilterValue { get; set; }
}

当我想实现某种过滤器功能时,我会在所有对话框中使用它。List<FilterItem>所以我用构造函数中传递的预填充来调用对话框表单。现在,当对话框加载时,它会遍历每个列表项并添加:

  1. 一个复选框
  2. 组合框
  3. 一个文本框

到 TableLayoutPanel 中的每一行。Checkbox 从...获取其文本属性FilterProperty及其 Checked 状态FilterPropertyChecked...Combobox 从...获取其绑定,FilterOperator而 Textbox 从...获取其文本值FilterValue

注意我只说得到。我想做的是在它们的属性必须更改的控件时自动更新这些属性。我听说过,ObservableCollection<T>但在添加命名空间后,我似乎无法在 Winforms 中“访问”它System.Collections.ObjectModel

实现这一目标的最佳方法是什么。BindingList 与 INotifyPropertyChanged?? 我不是后者的专家,并且非常感谢一些指示 - 如果这是我应该走的路。

感谢你!

编辑:

好的,让我发布一些代码来展示我认为我应该做什么:)。我知道我需要INotifyPropertyChanged在我的 FilterItem 类上实现,所以(例如,仅用于 FilterValue 部分):

public class FilterItem : INotifyPropertyChanged {
    public FilterItem() { }
    public string FilterProperty { get; set; }
    public bool FilterPropertyChecked { get; set; }
    public ComparitiveOperator FilterOperator { get; set; }

    private string _FilterValue;
    public string FilterValue {
        get { return this._FilterValue; }
        set {
            if (this._FilterValue != value) {
                this._FilterValue = value;
                this.OnFilterValueChanged();
            }
        }
    }

    #region INotifyPropertyChanged Members
    protected void OnFilterValueChanged() {
        var handler = this.PropertyChanged;
        if (handler != null) {
            handler(this, new PropertyChangedEventArgs("FilterValue"));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

现在它应该全部放在我的 Form_Load 中(这仅适用于文本框部分,我省略了 Checbox 和 ComboBox),如下所示:

private List<FilterItem> FilterList; // <-- this gets assigned to in the constructor

private void dlgFilterData_Load(object sender, EventArgs e) {
    foreach (FilterItem item in FilterList) {
        txt = new TextBox();
        txt.DataBindings.Add("Text", item, "FilterValue", false, DataSourceUpdateMode.OnPropertyChanged);
        txt.Dock = DockStyle.Fill;
    }
}

文本框的数据绑定 DataSource 是 FilterItem 的“项目”。但是现在我的 Visual Studio IDE 似乎有问题,所以不能尝试这个,但是当我启动并运行它时会。我现在想知道的是:此设置是否会成功地帮助我的个人FilterItem在他们分配的 Control 各自的属性发生变化时自动更新?

4

1 回答 1

3

ObservableCollection 类位于 WindowsBase 程序集中,因此您需要将 WindowsBase 添加到项目引用中才能“访问”它。

话虽如此,我认为 ObservableCollection 不会给你你想要的一切。当您添加或删除项目时,您的绑定控件将收到通知,但没有自动属性更改通知,这听起来像是您想要的。

无论您最终使用哪种集合,我认为您在使用 INotifyPropertyChanged 时都走在了正确的轨道上。下面是一个实现 INotifyPropertyChanged 的​​简单示例:

class Foo : INotifyPropertyChanged
{
    #region Bar property

    private string _bar;
    public string Bar
    {
        get { return _bar; }
        set
        {
            if (_bar != value)
            {
                _bar = value;

                OnPropertyChanged("Bar");
            }
        }
    }

    #endregion

    protected void OnPropertyChanged(string name)
    {
        var handler = PropertyChanged;

        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

基本上,只要您的对象的属性发生更改,就会触发 PropertyChanged 事件,并传递更改的属性的名称。

最后,所有这些可能都没有实际意义,因为您说过要更改对象属性的值以响应绑定到该属性的控件的更改。通常的 Windows 窗体数据绑定基础结构可以在没有 INotifyPropertyChanged 或任何其他接口的帮助下实现这一点。如果您需要从其他地方通知绑定控件您的对象属性的更改,则只需要实现 INotifyPropertyChanged。

于 2009-11-23T02:14:05.533 回答