为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
料青山看我应如是 2021-06-16 17:35:44
我很确定我错过了一些非常小的东西,但我一生都无法弄清楚我哪里出错了。我试图将我的数据网格绑定到实际上正在获取输入的 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}"));据我所知,一切都设置正确,我看不出任何错误。
查看完整描述

1 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您应该Server从 MainWindow 中删除该字段并启动 DataContext 中的服务器。


private void BtnStart_OnClick(object sender, RoutedEventArgs e)

{

    ((MasterViewModel)DataContext).Server.StartServer();

}

或者,像这样初始化视图模型:


DataContext = new MasterViewModel { Server = Server };

它将 Server 字段值分配给视图模型中的 Server 属性(然后必须是读/写)。否则,您将有两个 Server 实例。


查看完整回答
反对 回复 2021-06-20
  • 1 回答
  • 0 关注
  • 236 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信