【发布时间】:2010-12-19 08:02:28
【问题描述】:
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> 调用对话框表单。现在,当对话框加载时,它会遍历每个列表项并添加:
- 一个复选框
- 一个组合框
- 一个文本框
到 TableLayoutPanel 中的每一行。 Checkbox 从FilterProperty 获取其文本属性,从FilterPropertyChecked 获取其Checked 状态...Combobox 从FilterOperator 获取其绑定...而Textbox 从FilterValue 获取其文本值。
注意我只是说得到。我想做的是在它们的属性必须更改的控件时自动更新这些属性。我听说过 ObservableCollection<T>,但在添加 System.Collections.ObjectModel 命名空间后,我似乎无法在 Winforms 中“访问”它。
实现这一点的最佳方法是什么。 BindingList 与 INotifyPropertyChanged??我不是后者的专家,非常感谢一些指示 - 如果这是我应该走的路。
谢谢你!
编辑:
好的,让我发布一些代码来展示我认为我应该做什么:)。我知道我需要在我的 FilterItem 类上实现INotifyPropertyChanged,所以(仅针对 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 'item'。但是现在我的 Visual Studio IDE 似乎有问题,所以不能尝试这个,但是当我启动并运行它时会。我现在想知道的是:此设置能否成功帮助我的个人FilterItems 在其分配的 Control 各自的属性发生更改时自动更新??
【问题讨论】:
-
我是否也应该使用 BindingList
而不是普通的 List ?
标签: winforms observablecollection inotifypropertychanged