gpt4 book ai didi

c# - MVVM 中的双向数据绑定(bind)问题

转载 作者:太空狗 更新时间:2023-10-29 17:42:55 24 4
gpt4 key购买 nike

我正在尝试构建一个简单的 C#/WinFoms 项目,该项目根据结构使用 Model-View-ViewModel 设计模式:

enter image description here

两个 UserControl 和关联的 ViewModel 之间的数据绑定(bind)工作不正常。

MainForm 包含两个用户控件 (UC):Uc_CreateUc_Iteration。每个 UC 都包含一个组合框,该组合框连接到 ViewModel_xxx 中的关联属性,即

Uc_Create 具有:

this.comboBox1ComplexCreate.DataSource = oVM_Create.VM_Create_ListOfStringsInModel; 

Uc_Iteration 有:

this.comboBox1ComplexIteration.DataSource = oVM_Iteration.VM_Iteration_ListOfStringsInModel;

问题:

当我向 VM_Iteration_ListOfStringsInModel 添加元素时,相应 UC (comboBox1ComplexCreate) 中的组合框模型中的列表被正确更改但是Uc_Iteration 中的另一个组合框(comboBox1ComplexIteration)不是!

为什么????

如果我将模型中的 List 更改为 BindingList,一切正常。我做错了什么?

提前致谢!


型号:

namespace Small_MVVM
{

public class Model
{
private static readonly object m_oLock = new object();

private static Model instance;


public List<string> simplelistOfStrings;

private Model()
{
simplelistOfStrings = new List<string>();
}

public static Model GetInstance()
{
if (instance == null)
{
lock (m_oLock)
{
if (instance == null)
{
instance = new Model();
}
}
}
return instance;
}
}
}

ModelView_Create:

namespace Small_MVVM
{
class ViewModel_Create : NotifyPropertyChangedBase
{
private static Model oModel = Model.GetInstance();

private BindingList<string> _VM_Create_ListOfStringsInModel = new BindingList<string>(oModel.simplelistOfStrings);
public BindingList<string> VM_Create_ListOfStringsInModel
{
get
{

return _VM_Create_ListOfStringsInModel;
}
set
{
_VM_Create_ListOfStringsInModel = value;
this.FirePropertyChanged(nameof(VM_Create_ListOfStringsInModel));
}
}
}
}

ModelView_Iteration:

namespace Small_MVVM
{

class ViewModel_Iteration : NotifyPropertyChangedBase
{
private static Model oModel = Model.GetInstance();

public ViewModel_Iteration()
{

}

BindingList<string> _VM_Iteration_ListOfStringsInModel = new BindingList<string>(oModel.simplelistOfStrings);
public BindingList<string> VM_Iteration_ListOfStringsInModel
{
get
{
return _VM_Iteration_ListOfStringsInModel;
}
set
{
_VM_Iteration_ListOfStringsInModel = value;
this.FirePropertyChanged(nameof(VM_Iteration_ListOfStringsInModel));
}
}
}
}

这是实现 INotifyPropertyChange 接口(interface)的抽象类 NotifyPropertyChangedBase:

public abstract class NotifyPropertyChangedBase : INotifyPropertyChanged
{

public event PropertyChangedEventHandler PropertyChanged;

protected bool CheckPropertyChanged<T>(string propertyName, ref T oldValue, ref T newValue)
{
if (oldValue == null && newValue == null)
{
return false;
}

if ((oldValue == null && newValue != null) || !oldValue.Equals((T)newValue))
{
oldValue = newValue;
return true;
}

return false;
}

private delegate void PropertyChangedCallback(string propertyName);

protected void FirePropertyChanged(string propertyName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

最佳答案

如果您遵循 MVVM 模式,那么您应该使用 ObservableCollection 进行如下所示的集合

   private ObservableCollection<int> _intList;
public ObservableCollection<int> IntList
{
get
{
return _intList;
}
set
{
_intList= value;
_intList.CollectionChanged +=
new System.Collections.Specialized.NotifyCollectionChangedEventHandler
(MyProperty_CollectionChanged);
}
}

void MyProperty_CollectionChanged(object sender,
System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
NotifyPropertyChanged("IntList");
}

ObservableCollection - 表示动态数据集合,在添加、删除项目或刷新整个列表时提供通知。

你也可以检查这个:MVVM (Model-View-ViewModel) Pattern For Windows Form Applications, using C#

关于c# - MVVM 中的双向数据绑定(bind)问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49833049/

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