首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DotVVM GridView列可以动态定义吗?

DotVVM GridView列可以动态定义吗?
EN

Stack Overflow用户
提问于 2022-03-23 22:01:59
回答 1查看 25关注 0票数 0

是否可以使用动态定义的列创建DotVVM GridView (Business和Bootstrap版本OK)?

我正在更新一个应用程序,其中一些页面使用定制的网格,包括哪些列和一些属性(显示顺序、数据类型等)。存储在数据库中。当前版本在代码隐藏的运行时将列添加到(ASP.NET)网格中。有什么方法可以用DotVVM GridView达到同样的效果吗?

EN

回答 1

Stack Overflow用户

发布于 2022-06-15 10:16:24

是的当然有可能。我不会提供精确的代码,因为解决方案取决于您到底需要做什么,但我会尽我所能。

您可以将逻辑放在ViewModel.Load中,也可以创建一个自定义控件,该控件将成为GridView的包装器。

首先,您需要获得对GridView的引用。如果选择创建控件,只需使用(GridView)this.Children.Single()。要使它在视图模型中工作,请将一个ID=Something添加到您的GridView中,然后调用(GridView)Context.View.FindControlByClientId("Something")

GridView (来自DotVVM.Framework的和来自BusinessPack的)都有一个Columns属性,您可以将您想要的任何内容追加到它。

代码语言:javascript
复制
grid.Columns.Add(
    new GridViewTextColumn() {
        HeaderText= "Property 1",
        ValueBinding = ...
    }
);

您还必须创建值绑定表达式,这有点棘手。问题是,DotVVM希望在将绑定放入控件之前进行编译,但是对于编译,您需要知道控件的确切数据上下文--这有点像鸡和蛋问题。为此,您需要一个BindingCompilationService,您可以使用构造函数注入并从DI容器中获取它,或者只需调用var bindingService = Context.Services.GetRequiredService<BindingCompilationService>()。要获得所需的数据上下文,请使用此魔法咒语:

代码语言:javascript
复制
var dataContext = grid.GetValueBinding(GridView.DataSourceProperty)
    .GetProperty<CollectionElementDataContextBindingProperty>().DataContext;

然后创建绑定和网格列将非常容易:

代码语言:javascript
复制
grid.Columns.Add(
    new GridViewTextColumn() {
        HeaderText= "Property 1",
        ValueBinding = bindingService.Cache.CreateValueBinding("_this.Property1", dataContext)
    }
);

您可以为您的每个属性执行此操作。注意,CreateValueBinding助手方法是相对较新的,您肯定需要DotVVM 4.0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71594594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档