DataGridComboBoxColumn не инициализируется, поскольку объекты различаются (WPF) - PullRequest
0 голосов
/ 10 января 2019

В одном представлении содержится DataGrid. DataGrid представляет собой список материалов, и каждый материал содержит единицу, которую можно выбрать с помощью DataGridComboBoxColumn.

DataGrid и DataGridComboBoxColumn привязаны к двум различным ObservableCollection в моей модели представления: один для материалов и один для единиц. Эти коллекции инициализируются из базы данных при запуске.

Проблема в том, что когда я впервые загружаю страницу после ее инициализации, DataGridComboBoxColumn не имеет выбранного значения.

Это происходит потому, что отображаемый объект объекта внутри объекта материала не совпадает с объектом в коллекции объектов, инициализированной из базы данных.

Это код вида:

<DataGrid ItemsSource="{Binding Materials}" AutoGenerateColumns="False" Margin="10,10,10,0" Style="{StaticResource AzureDataGrid}">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Matériel" Binding="{Binding Name, ValidatesOnDataErrors=True}" Width="*"/>
                <mah:DataGridNumericUpDownColumn Header="Prix"
                                                 Binding="{Binding Price}"
                                                 StringFormat="C"
                                                 Minimum="0" 
                                                 Width="*"/>
                <DataGridComboBoxColumn Header="Unité"
                                        ItemsSource="{Binding Source={StaticResource Units}}"
                                        SelectedItemBinding="{Binding Unit, ValidatesOnDataErrors=True}" 
                                        DisplayMemberPath="Name"
                                        Width="*"/>
            </DataGrid.Columns>
        </DataGrid>

Это код ViewModel:

public MaterialViewModel(ISessionService sessionService, IMaterialRepository materialRepository)
    {
        _materialRepository = materialRepository;

        Materials = sessionService.Materials;
        Materials.CollectionChanged += MaterialsCollectionChanged;
        foreach (var item in Materials)
        {
            item.PropertyChanged += MaterialPropertyChanged;
        }

        Units = sessionService.Units;
    }

    public ObservableCollection<Material> Materials { get; set; }

    public ObservableCollection<Unit> Units { get; set; }

Просто чтобы быть уверенным, я попытался инициализировать коллекцию единиц с помощью объекта единиц, который находится в материальном объекте, и он работал как положено.

Кто-нибудь получил решение для этого?

Спасибо.

1 Ответ

0 голосов
/ 10 января 2019

Вы можете добавить свойство UnitName или UnitId к классу Material и связать его с помощью свойства SelectedValueBinding. Не забудьте также установить для свойства SelectedValuePath значение «Имя» или любое другое имя свойства класса Unit:

<DataGridComboBoxColumn Header="Unité"
                        ItemsSource="{Binding Source={StaticResource Units}}"
                        SelectedValueBinding="{Binding UnitName, ValidatesOnDataErrors=True}" 
                        SelectedValuePath="Name"
                        DisplayMemberPath="Name"
                        Width="*"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...