Как переопределить автоматизировать создание заголовка столбца сетки данных? - PullRequest
0 голосов
/ 16 октября 2018

поскольку WPF автоматически создает заголовки столбцов на основе того, какой класс содержит данные, я хотел бы спросить, есть ли возможность переопределить этот процесс?

Например, имея этот класс

public class Report
{
    public string Value { get; set; }
    public int Title { get; set; }
}

Я получу 2 столбца - |Значение |Title |

Как я теперь вижу, WPF создает заголовки этих столбцов, получая имя свойства и «вставляя» простой вывод того, что он получает

примерно так?

nameof(property);

Цель, которую я хочу достичь, - создать собственный атрибут для свойства, например

[Header("Price in €")]
public string Value { get; set}

, и позволить WPF создать заголовок столбца на основе этого атрибута, поэтому мои столбцы будут выглядеть так -

|Цена в € |Title |

Мой вопрос: как это переопределить?

1 Ответ

0 голосов
/ 16 октября 2018

Вы можете создать для этого простой Behavior.

Я буду использовать ComponentModel.DescriptionAttribute в этом примере, но вы, конечно, можете использовать любой пользовательский атрибут.

using System.ComponentModel;
using System.Windows.Interactivity;

class ExtendendHeadersBehavior : Behavior<DataGrid>
{
    protected override void OnAttached()
    {
        AssociatedObject.AutoGeneratingColumn += AssociatedObject_AutoGeneratingColumn;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.AutoGeneratingColumn -= AssociatedObject_AutoGeneratingColumn;
    }

    private void AssociatedObject_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if (e.PropertyDescriptor is PropertyDescriptor desc)
        {
            string header = desc.Attributes.OfType<DescriptionAttribute>()
                .FirstOrDefault()?.Description;

            if (!string.IsNullOrEmpty(header))
            {
                e.Column.Header = header;
            }
        }      
    }
}

Использование:

<DataGrid>
    <i:Interaction.Behaviors>
        <b:ExtendendHeadersBehavior/>
    </i:Interaction.Behaviors>
</DataGrid>

Пространства имен:

xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:b="clr-namespace:YourAppNamespace"
...