是否可以使用动态定义的列创建DotVVM GridView (Business和Bootstrap版本OK)?
我正在更新一个应用程序,其中一些页面使用定制的网格,包括哪些列和一些属性(显示顺序、数据类型等)。存储在数据库中。当前版本在代码隐藏的运行时将列添加到(ASP.NET)网格中。有什么方法可以用DotVVM GridView达到同样的效果吗?
发布于 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属性,您可以将您想要的任何内容追加到它。
grid.Columns.Add(
new GridViewTextColumn() {
HeaderText= "Property 1",
ValueBinding = ...
}
);您还必须创建值绑定表达式,这有点棘手。问题是,DotVVM希望在将绑定放入控件之前进行编译,但是对于编译,您需要知道控件的确切数据上下文--这有点像鸡和蛋问题。为此,您需要一个BindingCompilationService,您可以使用构造函数注入并从DI容器中获取它,或者只需调用var bindingService = Context.Services.GetRequiredService<BindingCompilationService>()。要获得所需的数据上下文,请使用此魔法咒语:
var dataContext = grid.GetValueBinding(GridView.DataSourceProperty)
.GetProperty<CollectionElementDataContextBindingProperty>().DataContext;然后创建绑定和网格列将非常容易:
grid.Columns.Add(
new GridViewTextColumn() {
HeaderText= "Property 1",
ValueBinding = bindingService.Cache.CreateValueBinding("_this.Property1", dataContext)
}
);您可以为您的每个属性执行此操作。注意,CreateValueBinding助手方法是相对较新的,您肯定需要DotVVM 4.0。
https://stackoverflow.com/questions/71594594
复制相似问题