为什么我的 ObservableCollection 不更新我的 UI?

我很确定我错过了一些非常小的东西,但我一生都无法弄清楚我哪里出错了。


我试图将我的数据网格绑定到实际上正在获取输入的 ConsoleLines 属性,我调试了它并且 ConsoleLines 包含多个字符串。但由于某种原因,它没有更新 UI 并将线条添加到 gridview .. 或者从技术上讲是 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}"));


据我所知,一切都设置正确,我看不出任何错误。


料青山看我应如是
浏览 237回答 1
1回答

白猪掌柜的

您应该Server从 MainWindow 中删除该字段并启动 DataContext 中的服务器。private void BtnStart_OnClick(object sender, RoutedEventArgs e){&nbsp; &nbsp; ((MasterViewModel)DataContext).Server.StartServer();}或者,像这样初始化视图模型:DataContext = new MasterViewModel { Server = Server };它将 Server 字段值分配给视图模型中的 Server 属性(然后必须是读/写)。否则,您将有两个 Server 实例。
打开App,查看更多内容
随时随地看视频慕课网APP