Привязать WPF DataGridTemplateColumnn ComboBox после загрузки страницы - PullRequest
0 голосов
/ 27 марта 2020

У меня проблемы с привязкой к столбцу DataGridTemplateColumn моего элемента управления. Я прочитал несколько постов по этому поводу, но, похоже, ни один из них не работает для меня должным образом, возможно, из-за архитектуры приложения - я не уверен. Привязка к DataGridTextColumn работает, но ComboBox, который я определил внутри столбца шаблона, пуст. У меня есть этот фрагмент XAML ::

    <jibcontrols:JibGrid x:Name="UsersDataGrid">
...
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox Text="{Binding Path=Role}" ItemsSource="{Binding Item, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}" DisplayMemberPath="Role"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Width="2*" Binding="{Binding Role}"></DataGridTextColumn>
...

Мы используем архитектуру шины сообщений, поэтому источник данных не готов при первоначальной загрузке страницы. После того, как данные возвращены из службы, вызывается метод для заполнения DataGrid:

    private void UpdateGrid(Users o)
    {
        Dispatcher.Invoke(() =>
        {
            var entities = o.OrderBy(e => e.Role);

            UsersDataGrid.FilteredItemsSource = entities;
            UsersDataGrid.DataContext = entities;
        });
    }

Что я ошибся в этом сценарии?

1 Ответ

0 голосов
/ 27 марта 2020

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

public class RoleList : List<string>
{
    public RoleList()
    {
        this.Add("Administrator");
        this.Add("Operator");
    }
}

Затем я добавил пространство имен, в котором находился класс:

xmlns:dm="clr-namespace:Coasters.ViewModels"

Затем я добавил тег Page.Resources для хранения моего нового источника данных:

<Page.Resources>
    <dm:RoleList x:Key="RoleList" />
</Page.Resources>

И последнее, но не менее важное: я действительно настроил ComboBox правильно (это всегда полезно) , используя ItemsSource, указывающий на мой источник данных, и SelectedItem, указывающий на свойство класса, которое содержит поле «Роль»:

        <DataGridTemplateColumn Width="*">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ComboBox ItemsSource="{StaticResource RoleList}" SelectedItem="{Binding Role}" />
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
...