在WinForm程序中,有时需要将ListView和DetailView一起显示,并且可控制是否显示DetailView如下图:
下面简述步骤:
1.创建BO类TestObject1,包含以下几个属性,省略了setter和getter:
public string Name
{
//...
}
}
public int Age
{
//...
}
}
[Size(SizeAttribute.Unlimited), ValueConverter(typeof(ImageValueConverter))]
public Image Photo{
//...}
2.进入model设计器,在Views节点下找到TestObject1_ListView,将其
MasterDetailMode从
ListViewOnly改成
ListViewAndDetailView:
3.运行,得到下面效果图:
注意,现在得到的Detail视图是系统默认的DetailView,可以直接在Detailview中编辑每项记录。
有时,我们可能不需要直接修改DetailView,而仅供查看,并且在Detailview中仅显示部分项,这时就需要在MasterDetailMode下使用我们自己的DetailView。实际上,在创建一个BO时,XAF已经为我们创建了一些默认的View,查看BOModel节点下我们定义的TestObject1,在外观组中可以看到所有默认的View:
而回到Views节点下查看TestObject1_ListView,在外观中MasterDetailView使用的就是我们默认的TestObject1_DetailView:
所以,我们就在这里修改,将MasterDetailView修改为我们新建的TestObject1_DetailView_Copy,我略微修改TestObject1_DetailView_Copy,让它仅显示Name和Photo,且不可编辑,此刻才能得到本文第一幅图的效果。当我们双击ListView记录时,仍可在弹出的DetailView中编辑,注意该DetailView使用的仍是默认DetailView,若希望弹出DetailView也为自定义的DetailView,在model设计器修改默认DetailView即可。
另外,也可以在代码中改变MasterDetailView的DetailView,修改Program.cs文件:
static void Main()
{
//...
winApplication.ListViewCreated += new EventHandler<ListViewCreatedEventArgs>(winApplication_ListViewCreated);
//...
}
private static void winApplication_ListViewCreated(object sender, ListViewCreatedEventArgs e)
{
e.ListView.CreateCustomCurrentObjectDetailView +=
new EventHandler<CreateCustomCurrentObjectDetailViewEventArgs>(
ListView_CreateCustomCurrentObjectDetailView);
}
private static void ListView_CreateCustomCurrentObjectDetailView(
object sender, CreateCustomCurrentObjectDetailViewEventArgs e)
{
e.DetailViewId = "TestObject1_DetailView_Copy";
}
-----------*-----------*-----------------*-------------------------*-------------------------*-------------------------------------*---------------------------*----------------------------------------
最后,我们需要控制MasterDetailMode可随时切换:
新建ViewController,并添加一个SimpleAction,在Action的Execute事件中执行:
private void simpleAction1_Execute(object sender, SimpleActionExecuteEventArgs e)
{
MasterDetailMode mdm = ((IModelListView)View.Model).MasterDetailMode;
mdm = mdm == MasterDetailMode.ListViewAndDetailView ? MasterDetailMode.ListViewOnly : MasterDetailMode.ListViewAndDetailView;
((IModelListView)View.Model).MasterDetailMode = mdm;
View.LoadModel();
}
运行程序,得到最终效果。