XAF将ListView和DetailView一起显示

在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,将其 MasterDetailModeListViewOnly改成 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();
        }
运行程序,得到最终效果。



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值