【问题标题】:WPF databound Datagrid change horizontal column orientation depending on data typeWPF数据绑定Datagrid根据数据类型更改水平列方向
【发布时间】:2013-11-01 14:11:00
【问题描述】:

我正在尝试根据数据类型(例如 Int32、float、..)更改数据绑定 DataGrid 的水平列对齐方式。

在网上搜索了我所学的一个简单示例后,通过 xaml 的 DataTriggers 应该是执行此操作的正确选择。那正确吗?如果是这样,我将如何实现触发器?

我对 WPF 很陌生,过去一直在使用 WindowsForms。根据数据类型更改列方向不是那么困难吗?任何帮助表示赞赏!

【问题讨论】:

    标签: c# wpf datagrid orientation databound


    【解决方案1】:

    这可能会有所帮助 - Different views / data template based on member variable

    另一种选择是使用 DataTemplate 选择器。只需查看本教程:http://tech.pro/tutorial/807/wpf-tutorial-how-to-use-a-datatemplateselector

    【讨论】:

    • 感谢您的帮助 :-) 我查看了两个链接,但无法在我的自定义网格中实现 xaml。我现在从后面的代码中解决了这个问题 - 请参阅下面的答案。当您看到下面的代码时,也许您对如何在 xaml 中执行相同的操作有其他建议?
    • 自动生成列的数据网格有一个技巧。您可以在后面的代码中处理 AutoGeneratingColumn 事件,并为特定列修改 CellTemplate。我不喜欢这种方法,因为我是 MVVM 的忠实粉丝。我将在下面发布答案
    【解决方案2】:

    您可以处理 AutoGeneratingColumn 事件。

    在您的 xaml 中添加:

    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="True" 
              AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn"></DataGrid>
    

    在代码隐藏中:

    private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
       if (e.PropertyType == typeof (Int32))
       {
           if (e.Column != null)
           {
              var dgct = new DataGridTemplateColumn();
              var cName = e.Column.Header as string;
              var b = new Binding(cName);
    
              var sfactory = new FrameworkElementFactory(typeof(TextBlock));
              sfactory.SetValue(TextBlock.TextProperty, b);
              sfactory.SetValue(TextBlock.TextAlignmentProperty, TextAlignment.Right);
              var cellTemplate = new DataTemplate();
              cellTemplate.VisualTree = sfactory;
              dgct.CellTemplate = cellTemplate;
    
              dgct.Header = cName;
              dgct.SortMemberPath = cName;
    
              e.Column = dgct;
           }
       }
    
       ... *and so on for all your data types*
    

    }

    您可以查看以下链接:

    http://msdn.microsoft.com/en-us/library/cc903950(v=vs.95).aspx http://mareinsula.wordpress.com/2011/06/06/tips-on-wpf-autogeneratinged-datagrid/

    【讨论】:

      【解决方案3】:

      好的,我现在已经从后面的代码中解决了这个问题。也许有人可以给我一个提示,我如何使用 XAML 更优雅地解决这个问题?我已经在网上搜索了几个小时来找到一个示例,这对于 WPF 新手来说并不难,只是没有找到任何能够成功实现的东西。

      好的,代码如下:将 DataTable 作为 DataSource 我添加以下内容:

      foreach (DataColumn cc in table.Columns)
      {
          Type type = cc.DataType;
      
          Style alignStyle = new Style(typeof(Microsoft.Windows.Controls.DataGridCell));                            
          alignStyle.Setters.Add(new Setter(Microsoft.Windows.Controls.DataGridCell.VerticalAlignmentProperty, VerticalAlignment.Center));
      
          var column = new Microsoft.Windows.Controls.DataGridTextColumn
          {
              Header = cc.ColumnName,
              Binding = new Binding(cc.ColumnName)
          };
      
          if(type.Name=="Int32"){
              alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
              column.Foreground = Brushes.Red;
              column.CellStyle = alignStyle;
          }
          else if (type.Name == "DateTime")
          {
              alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Center));
              column.Foreground = Brushes.Green;
              column.Binding.StringFormat = "{0:dd.MM.yyyy}";
              column.CellStyle = alignStyle;
          }
          else if (type.Name == "String")
          {
              alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Left));
              column.Foreground = Brushes.Blue;
              column.CellStyle = alignStyle;
          }
          else if (type.Name == "Double")
          {
              alignStyle.Setters.Add(new Setter(TextBlock.TextAlignmentProperty, TextAlignment.Right));
              column.Foreground = Brushes.Brown;
              column.Binding.StringFormat = "{0:F3}";
              column.CellStyle = alignStyle;
          }
      
          grids.Columns.Add(column);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-06
        • 2012-08-17
        • 2011-06-15
        • 2018-10-26
        相关资源
        最近更新 更多