我有一个小设计问题,由于某种原因我无法找到相关的谷歌搜索。
我有一个用户控件,我在我的应用程序中使用。 主窗体打开第二个窗体作为对话框。 Ť 他的第二种形式是使用包含列表框的用户控件。
当然,我希望在表单处理时保留列表框项目,这样我就会在主窗体中保留一个私有列表。
List<string> _listofFirstCoordinates = new List<string>();
现在问题是,对话框表格应该是负责将列表中继到主表单还是代码应该在用户控件中?
填充列表的人是否应该是用户控件
lst_Coordinates.Items.AddRange(ListOfCoordinates.Cast<object>().ToArray());
或者使用它的表单是否填充它(子表单)
uc_EditCoordinates.ListOfCoordinates = ListOfCoordinates;
让用户控件成为持有它的表单的公共变量也是可行的,这样可以直接更改或者设计不好吗?
编辑: 顺便说一下,数据现在保存在表单之间来回变量中,因为用户必须在提交之前完成所有子表单并最终将其保存到数据库中。所以它是
var _listofFirstCoordinates = new List<string>();
来回走动。
答案 0 :(得分:2)
&#34;正确&#34;解决方案是远离控制器和模型级关注点(在这种情况下,将UserControl
,MainForm
和UI控件)与视图级关注点抽象化(在这种情况下,你的申请数据)。
如果没有完全重新架构您的系统,您仍然可以在示例中应用此关注点分离。
你可以从概念上论证&#34;代码隐藏&#34;您的class MainForm : Form {
private void ShowChildFormModal() {
ChildViewModel vm = new ChildViewModel();
vm.CoordinatesList = ...
vm.OtherData = ...
ChildForm child = new ChildForm();
child.LoadFromViewModel( vm );
child.ShowDialog();
child.SaveToViewModel( vm );
SaveToDatabase( vm );
}
}
class ChildViewModel { // this is a POCO
public List<String> CoordinatesList;
public Int32 OtherData;
}
class ChildForm : Form {
public void LoadFromViewModel(ChildViewModel vm) {
// save time and trouble by using the List as a datasource directly, or you can manually populate the combobox as well
this.childUserControl.LoadFromViewModel( vm );
this.someOtherControl.Value = vm.OtherData;
}
public void SaveToViewModel(ChildViewModel vm) {
// completing this is an exercise for the reader
// but basically copy values from the controls on the form into the `vm` instance
}
}
class ChildUserControl : UserControl {
public void LoadFromViewModel(ChildViewModel vm) {
this.comboBox.DataSource = vm.CoordinatesList;
}
}
类充当种控制器(纯粹主义者不同意)。它 必须知道有关创建子表单的信息,但它不需要知道子表单中托管的用户控件 - 这将是子表单的关注点。
我建议定义一个代表ViewModel的类 - 尽管我们正在使用WinForms,但我们会将它用作一种粗略的单向&#34; ViewModel,如下:
{{1}}