【问题标题】:How can I bind a DataGridTemplateColumn to column value instead of row value?如何将 DataGridTemplateColumn 绑定到列值而不是行值?
【发布时间】:2010-11-05 17:10:34
【问题描述】:

我有一个属性网格控件,它有许多使用CellEditorTemplateSelector 自动应用的单元格编辑器。每个属性网格行都绑定到一个简单的 PropertyItemViewModel。

现在,我正在尝试重用所有这些单元格编辑器并将其呈现在 DataGrid 中,以便能够并排比较多个对象值。所以我添加了一个PropertiesRow 对象,其中包含PropertyItemViewModel 列表(与上面的属性网格相同)。

为了呈现每个单元格,我有一个简单的数据模板,它使用与属性网格相同的模板选择器。

<DataTemplate x:Key="CellDataTemplate">
    <ContentControl
         Content="{Binding Mode=OneWay}"
         ContentTemplateSelector="{StaticResource CellEditorTemplateSelector}" />            
</DataTemplate>

但是,要使其正常工作,模板需要PropertyItemViewModel(不是PropertiesRow),因此我必须以某种方式通过从PropertiesRow.PropertyItems[columnIndex] 获取正确的绑定来提供它。所以当我通过代码添加列时,我尝试了这样的事情:

void AddColumns()
{
    foreach (Property shownProperty in _ShownProperties)
    {
        _DataGrid.Columns.Add(new DataGridTemplateColumn()
        {
            Header = shownProperty.Name;
            Binding = new Binding("PropertyItems[" + index + "]");
            CellTemplate = (DataTemplate) FindResource("CellDataTemplate");
        });
    }
}

但是,DataGridTemplateColumn 没有 Binding 属性!所以我尝试为每一列生成一个中间 DataTemplate,但这开始变得非常复杂,我觉得必须有更简单的方法来做到这一点。

有什么建议吗?

【问题讨论】:

    标签: wpf binding wpfdatagrid


    【解决方案1】:

    我在使用上面的 XAML 时遇到了问题,但我得到了它的工作。必须设置Path='' 否则编译器不满意。

    Content="{Binding Mode=OneWay, Path='',
                      RelativeSource={RelativeSource FindAncestor, AncestorType=DataGridCell, 
                                      AncestorLevel=1}, 
                      Converter={StaticResource CellToColumnValueConverter}}"
    

    【讨论】:

      【解决方案2】:

      我找到了一种方法,但 MVVM 标准并不干净,因为它直接与 DataGridCells 一起使用,但除此之外它工作正常。

      我将单元格模板保持原样,除了没有将其绑定到我的 PropertiesRow 对象(它没有指示我们所在的列)之外,我使用相对源绑定到父 DataGridCell 进行绑定:

      <DataTemplate x:Key="CellDataTemplate">
          <ContentControl
              Content="{Binding Mode=OneWay,
           RelativeSource={RelativeSource FindAncestor, 
                                    AncestorType={x:Type Controls:DataGridCell}},
           Converter={StaticResource CellToColumnValueConverter}}}"
              ContentTemplateSelector="{StaticResource CellEditorTemplateSelector}" />            
      </DataTemplate>
      

      然后我添加了一个CellToColumnValueConverter,它采用 DataGridCell 并使用列的索引将其转换为 PropertyItem:

      public class CellToColumnValueConverter : IValueConverter
      {
          public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
          {
              DataGridCell cell = (DataGridCell) value;
              int displayIndex = cell.Column.DisplayIndex;
              PropertiesRow r = (PropertiesRow) cell.DataContext;
              return r.PropertyItems[displayIndex];
          }
      
          public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
          {
              throw new NotImplementedException();
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-02-13
        • 2011-04-06
        • 2012-07-04
        • 2011-08-08
        • 2014-05-13
        • 2011-02-06
        • 2020-01-19
        相关资源
        最近更新 更多