Почему мое представление не обновляется при добавлении данных из моего сервиса в мою модель представления? - PullRequest
0 голосов
/ 20 ноября 2018

Итак, я только что создал новый проект и пытаюсь добавить некоторые данные в коллекцию в моей ViewModel, однако, когда я добавляю в него данные, он добавляет, но не обновляет пользовательский интерфейс.

Этогде я устанавливаю DataContext и где я пытаюсь добавить контент в коллекцию

ProxyService ps;

public MainWindow()
{
    InitializeComponent();
    DataContext = new BaseViewModel();

    ps = new ProxyService();
    ps.AcceptConnection();
}

Имейте в виду, он добавляет его в коллекцию, ошибок нет, я его отладил, и этов коллекции.ProxyServer.cs

public class ProxyService : MessageViewModel
{
    public void AcceptConnection()
    {
        Messages.Add(new MessageModel { Message = "Awaiting connection..." });

Вот BaseViewModel

public class BaseViewModel
{
    public MessageViewModel MessageViewModel { get; set; } = new MessageViewModel();
}

И конечно же MessageViewModel

public class MessageViewModel : ObservableObject
{
    private ObservableCollection<MessageModel> _messages;

    public ObservableCollection<MessageModel> Messages
    {
        get { return _messages; }
        set
        {
            _messages = value;
            OnPropertyChanged();
        }
    }


    public MessageViewModel()
    {
        Messages = new ObservableCollection<MessageModel>();
    }
}

А вот XAML для ScrolLViewer, для которого яя добавляю данные

<ScrollViewer  Height="380"
                           Margin="10"
                           >
    <StackPanel>
        <ItemsControl ItemsSource="{Binding MessageViewModel.Messages}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock FontFamily="Consolas" 
                                           Foreground="#61d73d"
                                           Text="{Binding Message}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>

</ScrollViewer>

Проблема, с которой я сталкиваюсь, заключается в том, что она не обновляет пользовательский интерфейс при добавлении чего-либо. Однако!Если я добавлю что-то в конструктор, он будет работать нормальноВ качестве примера это работает просто отлично, оно показывает это в представлении соответственно

public MessageViewModel()
{
    Messages = new ObservableCollection<MessageModel>();
    Messages.Add(new MessageModel { Message = "Hello World!" });
}

Мое лучшее предположение - это добавление к другому какому-то экземпляру, но я не уверен, я действительно не хочуЯ должен использовать синглтон, потому что я чувствую, что это разрушит шаблон MVVM.

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Три примечания.

  1. Вы устанавливаете DataContext окна в один экземпляр BaseViewModel, а затем создаете отдельный экземпляр ProxyServiceClass.

  2. Ваша привязка для ItemsControl. ItemsSource должна быть просто привязкой к свойству DataContext, в данном случае сообщения.

  3. Не продолжайте воссоздаватьObservableCollection - просто создайте его один раз и добавляйте / удаляйте элементы по мере необходимости.Любой связанный элемент управления обнаружит, что он реализует INotifyCollectionChanged, и автоматически обновится при обновлении коллекции.

0 голосов
/ 20 ноября 2018

BaseViewModel - это один класс, а ProxyService - другой.Вы не можете ожидать, что MessageModel объекты, которые вы добавляете к последним, влияют на первый и наоборот.Попробуйте установить DataContext в BaseViewModel:

public MainWindow()
{
    InitializeComponent();
    ps = new ProxyService();
    ps.AcceptConnection();
    DataContext = new BaseViewModel { MessageViewModel = ps };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...