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

本文关键字:动态 参数 网格 编辑 查看 | 更新日期: 2023-09-27 18:08:40

我正在评估在c#/WPF/MVVM应用程序中查看和编辑参数的可能性。我目前正在寻找一些自定义控件从WPF Woolkit ExtendedTelerikDevExpressSyncfusion。我看到两个选项,一个PropertyGrid或一个类似datagrid的控件。

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

有没有人知道一个可靠的控件,支持绑定到一个集合和单独的值编辑器每行?

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

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

DataGrid允许您使用DataGridTemplateColumn,您可以在其中指定将应用于该列中的每个单元格的模板。这个模板可以包含您已经定义的UserControl,它分析它的DataContext并显示适当的控制。(这将是相当多的工作,但是,如果有现成的解决方案,您应该使用它来代替。)

经过一段时间的调查,我发现所有的框架都有能力在列中应用单独的单元格编辑器。

这通常在列定义中完成。网格有一个Columns集合。每个列可以设置一个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被绑定到包含NameValuePropertyId属性的视图模型。根据PropertyId选择控件。我喜欢Telerik控件的一点是,我不需要隐藏代码,因为ConditionalDataTemplateSelector在该框架中可用。我想MVVM最好保持你的视图干净的代码,

更新:

刚刚收到了来自Syncfusion的答案,他们说:

我们可以在一个列中加载不同的单元格编辑器。为此,我们必须处理dataGrid.Model.QueryCellInfo甚至我们必须根据数据改变CellType。我们无法避免代码滞后。但是这可以通过使用behavior来实现。