2013-10-09 41 views
0

我有一个需求,我需要从DataTable中直接显示数据,即不需要对单元进行编辑。另一个要求是我需要显示Combobox作为每列的标题。其次,第一列需要是checkbox,检查哪一行是灰色的。我认为这应该是可行的DataGrid,但我不确定,因为我无法找到办法做到这一点。使用视图模型将数据表绑定到DataGrid

可以请有人帮助我。请注意,我希望使用MVVM方式,而不是在xaml.cs中编写代码。

热切期待着回复。

在此先感谢。

编辑:代码添加虽然它没有太大的... 的.xaml

<DataGrid HorizontalAlignment="Left" Margin="0,274,0,0" VerticalAlignment="Top" Height="321" Width="981" AutoGenerateColumns="True" ItemsSource="{Binding Path=UploadedProductData, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}"> 
      <DataGrid.Columns> 
       <DataGridTemplateColumn CanUserReorder="False" CanUserResize="False"> 
        <DataGridTemplateColumn.HeaderTemplate> 
         <DataTemplate> 
          <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="100"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.HeaderTemplate> 
        <DataGridTemplateColumn.CellTemplate> 
         <DataTemplate> 
          <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="" VerticalAlignment="Top"/> 
         </DataTemplate> 
        </DataGridTemplateColumn.CellTemplate> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 

在主窗口的视图模型 -

DataTable _uploadedProductData; 
     public DataTable UploadedProductData 
     { 
      get { return _uploadedProductData; } 
      set 
      { 
       _uploadedProductData = value; 
      } 
     } 

以上是财产。

在xaml.cs - 我设定的上述属性 - 一些按钮事件,你在你的要求说

ViewModel.UploadedProductData = dt; 
+1

有很多教程会帮助你,但我不会去搜索它们,只是给你答案。我给你的一个建议是不要直接使用数据表,而是把它变成一个集合(毕竟这是MVVM的方式);无论是手动或借助一些库,将行映射到类的实例。然后,您可以添加一个代表复选框的单独属性,并使用绑定来解决其他所有问题。 DataGrid有许多选项可用于您需要指定的各种模板,这就是它。 –

+0

新用户越来越多地来到“StackOverflow”并寻求完整项目的帮助。这是*不* *什么StackOverflow是。我们的想法是,每个开发人员*都会自己完成工作*,并且只会在这里提出如何解决特定问题,同时提供他们的代码示例。从[StackOverflow帮助中心](http://stackoverflow.com/help/dont-ask),*您的问题应合理范围。如果你可以想象整本书能够回答你的问题,那么你的要求太高了。*请阅读帮助页面。 – Sheridan

+0

是的 - 其实我确实经历了一些教程,但我不确定如何构建GRID模板,这就是我的主要问题,......这种方法。此外,我提供了DataTable使事情变得更简单,我可以肯定地在最终版本中通过一个类来做到这一点。感谢您的回应。 – Saket

回答

0

一切都是完全有可能在WPF。 WPF大部分都是可能的。现在您已经提供了一些代码,我可以看到您缺少所需的INotifyPropertyChanged接口...单击此链接获取帮助。您需要实现这个功能,以便在属性值更改后更新UI ...您是否看到如何包含代码示例已为您工作?

确实有可能创建一个DataTemplate定义什么是在DataGridHeader部分看到。你可以认为DataTemplate的,作为一个特定数据的微小视图,可以使用DataGrid.RowHeaderTemplate财产,你已经几乎得到了设置DataTemplateHeader

<DataGrid> 
    <DataGrid.RowHeaderTemplate> 
     <DataTemplate> 
      <!--Define how you want the header to look here--> 
     <DataTemplate> 
    </DataGrid.RowHeaderTemplate> 
</DataGrid> 

现在,当涉及到结合这些单元格,它确实取决于您正在使用的对象。在WPF中,习惯(但不是强制性的)创建精确表示数据的数据类型对象。在你的情况下,我假设你只会使用你的DataTable对象,所以它是重要的列名。

最好是使用DataGridTextColumn列显示文本和你可以也选择使用DataGridTextColumn.HeaderTemplate代替如果希望Header为不同的列是不同的:

<DataGrid.Columns> 
    <DataGridTextColumn Binding="{Binding Path=ColumnName0}"> 
     <DataGridTextColumn.HeaderTemplate> 
      <ComboBox HorizontalAlignment="Right" VerticalAlignment="Top" Width="100"/> 
     </DataGridTextColumn.HeaderTemplate> 
    </DataGridTextColumn> 
    <DataGridTextColumn Header="First Name" Binding="{Binding Path=ColumnName1}" /> 
    <DataGridTextColumn Header="Last Name" Binding="{Binding Path=ColumnName2}" /> 
</DataGrid.Columns> 

现在我猜测你会问如何填充ComboBox.ItemsSource项目集合,但我没有时间。为此,我会将您的帖子转介给WPF ComboBox in DataGridTemplateColumn with alternate ItemsSource,并说如果这对您没有帮助,您可以从互联网搜索中轻松找到这些信息。

+0

首先,感谢您的回应。现在,这工作,我能绑定我的数据表。对于组合框,我将按照我在其他表单上的操作进行管理。再次感谢 !!!看了你提供的代码后 - 我觉得很愚蠢!在我的搜索中,我从来没有得到 - ** DataGridTextColumn **我一直在尝试将TextBlock绑定到Datatable单元格 - 不知何故。 – Saket

+0

嘿,不久之前我也犯了类似的错误......这都是学习经历的一部分。 – Sheridan

相关问题