ComboBox не обновляется при изменении BindableCollection <T> - PullRequest
0 голосов
/ 04 февраля 2020

Я создаю приложение WPF, используя Caliburn.Micro для MVVM. Я пытаюсь добавить клиента во время работы приложения, но не могу получить ComboBox для обновления / refre sh. Печатая на консоль, я подтвердил, что в BindableCollection есть элемент, добавляемый к нему, но хотя я включил строку:

NotifyOfPropertyChange(() => Clients);

в определение свойства, ComboBox не обновлено / обновлено.

Вот код:

Элемент управления ComboBox в ShellView.xaml

<ComboBox Grid.Column="2" Grid.Row="1" MinWidth="200" Margin="0,0,0,5"
          x:Name="Clients" SelectedItem="{Binding SelectedClient}">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ClientName}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Элемент управления кнопкой в ​​NewClientView.xaml

<Button x:Name="AddClient" Content="Add Client" Width="100" Margin="5"/>

Свойство в ShellViewModel.cs:

public BindableCollection<ClientModel> Clients
{
    get
    {
        return _clients;
    }
    set
    {
        _clients = value;
        NotifyOfPropertyChange(() => Clients);
    }
}

Обратный код кнопки в NewClientViewModel.cs (пользовательский элемент управления для добавления нового клиента):

public void AddClient(BindableCollection<ClientModel> Clients)
{
    DataAccess.Clients.Add(new ClientModel
    {
        ClientName = ClientNameInput,
        ClientProducts = null
    });

    Clients = new BindableCollection<ClientModel>(DataAccess.Clients);

    TryClose(true);
}

Любой идеи? Спасибо.

* Редактировать 1

Когда я пытаюсь добавить клиента напрямую с помощью этого кода:

public void AddClient(BindableCollection<ClientModel> Clients)
{
    Clients.Add(new ClientModel
    {
        ClientName = ClientNameInput,
        ClientProducts = null
    });

    TryClose(true);
}

он выдает «System.Reflection.TargetInvocationException» - Inner Исключение 1: NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта.

* Редактировать 2

Конструктор для моей ShellViewModel:

public ShellViewModel()
{
    Clients = new BindableCollection<ClientModel>(GenerateTestData());
}

GenerateTestData () возвращает Список типа ClientModel.

Призыв открыть UserControl для добавления нового клиента:

public void LoadNewClient()
{
    ActivateItem(new NewClientViewModel());
}

1 Ответ

0 голосов
/ 28 февраля 2020

Используйте EventAggregator для передачи переменных между ViewModels. Я могу объяснить более подробно, если стандартной документации недостаточно.

...