【问题标题】:View / Edit dynamic parameters in a grid在网格中查看/编辑动态参数
【发布时间】:2013-04-11 08:52:20
【问题描述】:
我正在评估在 C#/WPF/MVVM 应用程序中查看和编辑参数的可能性。我目前正在研究来自 WPF Woolkit Extended、Telerik、DevExpress 和 Syncfusion 的一些自定义控件。我看到两个选项,PropertyGrid 或类似 DataGrid 的控件。
问题:我的参数内容在一个集合中,而 PropertyGrids 似乎不喜欢这些,它们喜欢绑定到具有属性的对象。另一方面,我的参数有不同的值类型,这是数据网格不喜欢的,列总是有相同的值编辑器(例如复选框、日期选择器等)。
有人知道支持绑定到集合和每行单独的值编辑器的可靠控件吗?
其他要求是分层数据表示、验证和搜索功能。
【问题讨论】:
标签:
c#
wpf
data-binding
datagrid
propertygrid
【解决方案1】:
DataGrid 允许您使用DataGridTemplateColumn,您可以在其中指定将应用于该列中每个单元格的模板。此模板可能包含您定义的UserControl,它分析其DataContext 并显示适当的控件。 (不过,这将是一项相当多的工作,因此如果存在开箱即用的解决方案,您应该改用它。)
【解决方案2】:
经过一段时间的调查,我发现所有框架都能够在列中应用单个单元格编辑器。
这通常在列定义中完成。一个网格有一个 Columns 集合。每列都可以设置一个 CellTemplateSelector,这是我最初遇到问题的关键。
这里是 Telerik 网格视图的一个小 sn-p,但在 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。我们无法避免代码落后。但这可以使用行为来实现。