gpt4 book ai didi

winforms - Winforms 中的 ObservableCollection 和可能的替代方案

转载 作者:行者123 更新时间:2023-12-04 14:43:23 26 4
gpt4 key购买 nike

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 中的每一行。复选框从 FilterProperty 获取其文本属性及其来自 FilterPropertyChecked 的已检查状态...组合框从 FilterOperator 获取绑定(bind)...文本框从 FilterValue 获取其文本值.

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

完成此任务的最佳方法是什么。带有 INotifyPropertyChanged 的​​绑定(bind)列表??我不是后者的专家,非常感谢一些指点 - 如果这是我应该走的路。

谢谢你!

编辑:

好的,让我发布一些代码来展示我认为我应该做的事情:)。我知道我需要实现 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;
}
}

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

最佳答案

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

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

无论您最终使用哪种集合,我认为您使用 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 事件,并传递发生变化的属性的名称。

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

关于winforms - Winforms 中的 ObservableCollection<T> 和可能的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1780655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com