我有一个小编写的应用程序使用MVP模式,如下所示:
表单包含ListView组件。填充ListView的项目在演示者中创建。我听说在演示者中使用UI组件类不是一个好主意。我应该如何以及在何处创建这些ListViewItems?我可以在表单本身创建ListViewItems,但是表单不需要尽可能轻量级而没有逻辑吗?
编辑:N.B。这是一个Windows窗体应用程序
答案 0 :(得分:2)
我可以在中创建ListViewItems 形式本身,但不是形式 需要尽可能轻量级 没有逻辑吗?
一个简单的循环,并不认为简单的对象创建是困难的。对于View来说,这样的代码相当轻量级:
class SomeView
{
void SetData(IEnumerable<DataItem> dataItems)
{
foreach(DataItem dataItem in dataItems)
{
ListViewItem lvi = new ListViewItem();
lvi.Text = dataItem.Text;
...
}
}
}
此外,您可以使用Binding(如其他人建议的那样)。这将进一步简化SetData。
尽量保持查看代码非常简单,您可以通过快速代码审查来“验证”它: - )
答案 1 :(得分:1)
ListViewItems是特定于视图的,因此您应该在视图中创建它们。如果您在演示者中创建它们,则所有视图都必须依赖于ListViewItems,这是不好的。
答案 2 :(得分:1)
在演示者中创建数据项。将这些分配给视图并让视图使用数据绑定来显示数据项:
//in presenter
var dataItems = _someService.GetData();
_view.Data = dataItems;
//in view code-behind
public ICollection<DataItem> Data
{
get; set; //omitted for brevity - will require change notification
}
//in view XAML
<ListView ItemsSource="{Binding Data}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Path=Name}"/>
<GridViewColumn DisplayMemberBinding="{Binding Path=Age}"/>
</GridView>
</ListView.View>
</ListView>
答案 3 :(得分:0)
我最近有同样的难题,但是对于树视图。
要很好地解决它,您必须使用委托来处理数据到可视元素的创建/转换。
示例:
class View
{
TreeNode Builder(object foo, object bar) { ... }
}
class Presenter
{
void InitView(View v)
{
Model.Build(v.Builder);
}
}
好的,这非常粗糙,但它可以让你很容易地构建像树一样的递归结构。 :)
注意:模型和视图实际上并不关心彼此的类型。
答案 4 :(得分:0)
WinForms因为技术不是为MVP设计的,所以关注分离的好主意应该有理由。 我希望控制形式,演示者应该没有视图特定的东西。任何控件本身都打破了mvp,因为它包含数据和表示。随着您的应用程序的增长,保持MVP风格将变得越来越难。实施MVP没有多大好处。 通常,使用WinForms传统的控件风格(组件式)效果很好。