Связывание заголовка столбца с ресурсом Items

У меня есть источник ресурсов и из которого я связываю значения в сетке данных

    <DataGridTextColumn Header="Message" Binding="{Binding Path=message}"/>
    <DataGridTextColumn Header=" Logger" Binding="{Binding Path=logger}"/>
    <DataGridTextColumn Header="Level" Binding="{Binding Path=level}" />

Я должен связать текст заголовка с помощью словаря ключей

    Dictionary<String, object>.KeyCollection keyslist = dict1.Keys;

с этим словарем я должен связать текст заголовка.

Возможно ли иметь два источника данных для Datagrid?

1 ответ

Краткий ответ на ваш вопрос: да, это возможно. Хотя это грязный способ делать вещи, и я бы не рекомендовал делать это таким образом (если только вам это не нужно, поскольку я не знаю ваших деталей контекста), вот идея:

  1. Первая проблема заключается в том, что привязка заголовка несколько нарушена. Мне не удалось связать его обычными средствами, кроме как через Source={x:Static}, чтобы определить альтернативный текстовый текст.

  2. Привязка к коллекции невозможна в привязке Заголовка, поэтому вам нужно присвоить ей значение масштабатора ИЛИ написать преобразователь, который принимает параметр и ищет его в словаре, чтобы получить реальное значение.

А вот пример кода, демонстрирующий, как мы это сделали для проверки привязки (без конвертера):

XAML

<Window x:Name="window" x:Class="WpfDataGridMisc.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="214" DataContext="{Binding Source={x:Static wpfDataGridMisc:PersonsViewModel.Instance}}"
        xmlns:wpfDataGridMisc="clr-namespace:WpfDataGridMisc">
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Persons}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding FirstName}" Header="{Binding Source={x:Static wpfDataGridMisc:PersonsViewModel.Instance}, Path=Header1}" />
        </DataGrid.Columns>
    </DataGrid>
</Window>

PersonsViewModel

using System;
using System.Collections.ObjectModel;

namespace WpfDataGridMisc
{
    public class PersonsViewModel
    {
        private static readonly PersonsViewModel Current = new PersonsViewModel();

        public static PersonsViewModel Instance { get { return Current; } }

        private PersonsViewModel()
        {
            Persons = new ObservableCollection<Person>
                {
                    new Person {FirstName = "Thomas", LastName = "Newman", Date = DateTime.Now},
                    new Person {FirstName = "Dave", LastName = "Smith", Date = DateTime.Now},
                };
            Header1 = "Header 1";
        }

        public ObservableCollection<Person> Persons { get; private set; }

        public string Header1 { get; set; }
    }
}

Класс Person - это стандартное poco, выводимое из Person в коде выше.

Кредит: Спасибо Johan Larsson за большую часть кода. Он работал над этим решением, а я просто помогал, но он чувствовал, что я должен опубликовать ответ, так как x: Static был моей идеей.

Другие вопросы по тегам