经过一段时间的调查,我发现所有框架都能够在列中应用单个单元格编辑器。
这通常在列定义中完成。网格有一个Columns集合。每列都可以设置一个CellTemplateSelector,这是我最初问题的关键。
这是 Telerik 网格视图的一个小片段,但就我所知,它们的行为都相同,直到 CellTemplateSelector。当然,所有 3rd 方 UI 库的供应商似乎都复制了WPF DataGrid的行为。
<telerik:RadGridView x:Name="radGridView"
AutoGenerateColumns="False">
<telerik:RadGridView.Columns>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Name}" Header="Parameter" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Value}" Header="Value">
<telerik:GridViewDataColumn.CellTemplateSelector>
<telerik:ConditionalDataTemplateSelector>
<telerik:DataTemplateRule Condition="PropertyId < 1">
<DataTemplate>
<TextBox Text="{Binding Value, StringFormat=c}"/>
</DataTemplate>
</telerik:DataTemplateRule>
<telerik:DataTemplateRule Condition="PropertyId > 0">
<DataTemplate>
<CheckBox IsChecked="{Binding Value}" />
</DataTemplate>
</telerik:DataTemplateRule>
</telerik:ConditionalDataTemplateSelector>
</telerik:GridViewDataColumn.CellTemplateSelector>
</telerik:GridViewDataColumn>
</telerik:RadGridView.Columns>
在此示例中,网格的 ItmesSource 绑定到包含Name、Value和PropertyId属性的我的视图模型。根据PropertyId选择一个控件。我喜欢 Telerik 控件的一点是我不需要代码隐藏,因为ConditionalDataTemplateSelector在该框架中可用。我猜,MVVM 可以更好地保持您的视图没有代码。
更新:
刚刚收到Syncfusion的答复,他们说:
我们可以在一列中加载不同的单元格编辑器。为此,我们甚至必须处理 dataGrid.Model.QueryCellInfo 并且我们必须根据数据更改 CellType。我们无法避免代码落后。但这可以使用行为来实现。