【问题标题】:Binding DataGrid Row Number to Property将 DataGrid 行号绑定到属性
【发布时间】:2021-04-19 16:09:11
【问题描述】:

我有一个DataGrid(名为OperatorDataGrid),行号是通过LoadingRow 事件设置的:

private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    e.Row.Header = (e.Row.GetIndex() + 1).ToString();
}

DataGrid 本身绑定到ObservableCollection<FilterRow>,其中FilterRow 作为一个名为Index 的属性(当前未使用)。绑定在用户控件的构造函数中完成:

public AdvancedFilter()
{
    InitializeComponent();
    SetDefaults();

    FilterRows.Add(new FilterRow());
    OperatorDataGrid.ItemsSource = FilterRows;
}

我不知道如何将Row.Header 值绑定回模型,因为可以不断添加/删除项目。 LoadingRow 方法处理显示 DataGrid 中的数字,但我无法将该值返回到绑定到该特定行的对象中,因为标题不是在 <DataGrid.Columns> 部分中定义的特定列XAML。我确实尝试了found here 的解决方案,但是每当我添加新行时,标题单元格将显示每一行的 Index 为 0。任何建议将不胜感激。

【问题讨论】:

  • 请记住,对 GetIndex () 方法的单次调用并不能保证在元素的整个生命周期内设置正确的索引。如果元素被删除或插入到集合中,则必须为从更改的元素到集合末尾的所有行再次调用此方法。在 DataGrid 中应用不同的排序时,您也会遇到问题。一般来说,索引的分配最好在 VM 中完成,在 DataGrid 中是绑定到这个属性。

标签: c# wpf data-binding datagrid


【解决方案1】:

您可以在设置Header时自己设置源属性:

private void DataGrid_LoadingRow(object sender, DataGridRowEventArgs e)
{
    int rowNumber = e.Row.GetIndex() + 1;
    e.Row.Header = rowNumber.ToString();

    var dataObject = e.Row.DataContext as YourClass;
    if (dataObject != null)
        dataObject.RowNumber = rowNumber;
}

那么你就知道你在视图中看到的行号是和数据对象的属性同步的。

无法直接绑定到 XAML 中的 GetIndex() 之类的方法,这就是您首先要处理 LoadingRow 事件的原因。

【讨论】:

  • 我试图找出字符串的索引(你需要寻找那个主题),据我所知,这种方法并不能保证在所有情况下都能正确操作。在源集合中插入和删除项目以及在 DataGrid 中使用排序时会出现问题。
  • @EldHasp 幸运的是,对于我的使用,排序将不可用,一次只能删除一个项目,它始终是最后一个项目。
  • @mm8 我认为这正是我所需要的。谢谢,我试试看。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2022-07-09
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
相关资源
最近更新 更多