Почему моя коллекция ObservableCollection не обновляет мой интерфейс? - PullRequest
0 голосов
/ 18 мая 2018

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

Я пытаюсь связать свою сетку данных со свойством ConsoleLines, котороеНа самом деле, получая входные данные, я отлаживал его, и ConsoleLines содержит несколько строк.Но по какой-то причине он не обновляет пользовательский интерфейс и не добавляет строки в сетку. Или технически TextBlock.

Итак, у меня есть настройки MainWindows, такие как

public partial class MainWindow : Window
    {
        Server Server = new Server();
        public MainWindow()
        {
            InitializeComponent();
            DataContext = new MasterViewModel();
        }

        private void BtnStart_OnClick(object sender, RoutedEventArgs e)
        {
            Server.StartServer();
        }
    }

Как вы можетевидите, я устанавливаю DataContext для нового экземпляра MasterViewModel, который выглядит следующим образом

public class MasterViewModel
    {
        public Server Server { get; }
            = new Server();
    }

А вот мой класс сервера

public class Server : INotifyPropertyChanged
    {
        public Process pServer;
        public Server()
        {

        }

        public ObservableCollection<string> ConsoleLines { get; }
            = new ObservableCollection<string>();

        public void StartServer()
        {
            pServer = new Process();

            pServer.StartInfo.FileName = "java";
            pServer.StartInfo.Arguments = @"-jar " + "-Xms512M -Xmx1G spigot.jar";
            pServer.StartInfo.UseShellExecute = false;
            pServer.StartInfo.RedirectStandardOutput = true;
            pServer.StartInfo.RedirectStandardError = true;
            pServer.StartInfo.RedirectStandardInput = true;

            pServer.OutputDataReceived += OKDataReceived;
            pServer.ErrorDataReceived += ErrorDataReceived;

            pServer.Start();

            pServer.BeginErrorReadLine();
            pServer.BeginOutputReadLine();
        }

        private void ErrorDataReceived(object sender, DataReceivedEventArgs e)
            => Application.Current.Dispatcher.Invoke(() => ConsoleLines.Add($"ERROR: {e.Data}"));

        private void OKDataReceived(object sender, DataReceivedEventArgs e)
            => Application.Current.Dispatcher.Invoke(() => ConsoleLines.Add($"MESSAGE: {e.Data}"));

        public event PropertyChangedEventHandler PropertyChanged;
        [NotifyPropertyChangedInvocator]
        private void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

Насколько я знаю, все настроено правильноЯ не вижу ничего неправильного.

А вот мой XAML

<DataGrid ItemsSource="{Binding Server.ConsoleLines}" Width="400" Margin="182,109,210,68">
            <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding}"></TextBlock>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>
        <Button Name="BtnStart" Click="BtnStart_OnClick" Content="Start Server" HorizontalAlignment="Left" Margin="365,388,0,0" VerticalAlignment="Top" Width="75"/>

РЕДАКТИРОВАТЬ Инициализация нового экземпляра сервера и затем с помощью кнопки, чтобы запустить метод на новомпохоже, проблема в том ... Я не знаю, почему, хотя.

1 Ответ

0 голосов
/ 18 мая 2018

Вы должны удалить поле Server из своего главного окна и запустить сервер, который находится внутри вашего DataContext.

private void BtnStart_OnClick(object sender, RoutedEventArgs e)
{
    ((MasterViewModel)DataContext).Server.StartServer();
}

В качестве альтернативы, инициализируйте модель представления следующим образом:

DataContext = new MasterViewModel { Server = Server };

который присваивает значение поля Server свойству Server в вашей модели представления (которая затем должна быть доступна для чтения / записи).В противном случае у вас есть два экземпляра сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...