我正在评估在C#/ WPF / MVVM应用程序中查看和编辑参数的可能性。我目前正在研究来自 WPF Woolkit Extended , Telerik , DevExpress 和 Syncfusion 的一些自定义控件。我看到两个选项,一个是PropertyGrid或一个类似DataGrid的控件。
问题:我的参数内容在集合中 而PropertyGrids似乎不喜欢那些,他们喜欢绑定到具有属性的对象。另一方面,我的参数有不同的值类型,这是数据网格不喜欢的东西,列总是有相同的值编辑器(例如复选框,日期选择器等)。
是否有人知道支持绑定到集合的可靠控件以及每行的单个值编辑器?
其他要求是分层数据表示,验证和搜索功能。
答案 0 :(得分:1)
DataGrid
允许您使用DataGridTemplateColumn
,您可以在其中指定将应用于该列中每个单元格的模板。此模板可能包含您已定义的UserControl
,它会分析其DataContext
并显示相应的控件。 (但这将是相当多的工作,所以如果存在开箱即用的解决方案,你应该使用它。)
答案 1 :(得分:1)
经过一段时间的调查后,我发现所有框架都能够在列中应用单个单元格编辑器。
这通常在列定义中完成。网格具有列集合。每列都可以设置 CellTemplateSelector ,这是我最初问题的关键。
这是Telerik网格视图的一个小片段,但到了CellTemplateSelector,它们的行为都是一样的,据我所知。当然,所有第三方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绑定到包含名称,值和 PropertyId 属性的视图模型。基于 PropertyId ,选择了一个控件。我喜欢Telerik控件的是我不需要代码隐藏,因为 ConditionalDataTemplateSelector 在该框架中可用。对于MVVM来说,最好让你的视图保持清晰,我猜。
<强>更新强>
刚收到 Syncfusion 的回答,他们说:
我们可以在一列中加载不同的单元格编辑器。为此,我们必须处理dataGrid.Model.QueryCellInfo,我们必须根据数据更改CellType。我们无法避免代码背后。但这可以使用行为来实现。