在网格中查看/编辑动态参数

时间:2013-04-11 08:52:20

标签: c# wpf data-binding datagrid propertygrid

我正在评估在C#/ WPF / MVVM应用程序中查看和编辑参数的可能性。我目前正在研究来自 WPF Woolkit Extended Telerik DevExpress Syncfusion 的一些自定义控件。我看到两个选项,一个是PropertyGrid或一个类似DataGrid的控件。

问题:我的参数内容在集合中 而PropertyGrids似乎不喜欢那些,他们喜欢绑定到具有属性的对象。另一方面,我的参数有不同的值类型,这是数据网格不喜欢的东西,列总是有相同的值编辑器(例如复选框,日期选择器等)。

是否有人知道支持绑定到集合的可靠控件以及每行的单个值编辑器?

其他要求是分层数据表示,验证和搜索功能。

2 个答案:

答案 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 &lt; 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。我们无法避免代码背后。但这可以使用行为来实现。