如何从单独的类中将文本数据绑定到文本框中

时间:2018-02-16 11:56:51

标签: c# .net wpf xaml data-binding

好的,所以我正在尝试将一些数据绑定到我的应用程序中的文本框,这就是它的样子。 我有一个带有文本框的Page.xaml(以及其他一些东西,但我们不关心那些,因为我们想要将数据绑定到文本框而不是其他任何东西)

我有一个叫做Server的类,这个类负责启动.jar文件和其他一些小问题。 当它启动进程时,它会启动一个BAT文件,你知道,这是一个cmd窗口。 然后我已经把它重定向到输出的位置,所以无论打印到cmd窗口我们想要捕获并附加到PlayPage.xaml上的文本框中,这是我之前提到的页面。

我遇到的问题是我想将来自cmd窗口的任何内容数据绑定到我的文本框,这是可能的,因为我之前已经完成了但是它不是通过使用数据绑定。

所以换句话说。发送到cmd窗口的文本我希望将其重定向到我的文本框。

这是一张图片,显示了打印到cmd窗口的文本(随着时间的推移,它会继续打印) enter image description here

这是项目的结构

enter image description here

这是XAML

<TextBox x:FieldModifier="public" Name="TbConsoleOutput" Background="#262626" Foreground="GreenYellow" HorizontalAlignment="Left" Height="141" Margin="10,33,0,0" TextWrapping="NoWrap" Text="{Binding Output}" VerticalAlignment="Top" Width="660"/>

这是班级

using System.Diagnostics;
using System.IO;
using System.Windows;
using CraftaServ.Pages;
using Microsoft.Win32;

namespace CraftaServ.Classes
{
    public class Server
    {
        private readonly PlayPage PlayPage;


        public int ProcessID;
        public Process ServerProcess = new Process();
        public string Output { get; set; }


        public void StartServer()
        {
            var ofd = new OpenFileDialog();
            ofd.Filter = "Server File | *.jar";
            if (ofd.ShowDialog() == true)
            {
                var IsStarted = false;
                var FilePath = Path.GetFileName(ofd.FileName);

                var StartInfo = new ProcessStartInfo("java", $"-Xmx1024M -jar craftbukkit-1.12.2.jar -o true");

                StartInfo.UseShellExecute = false;

                StartInfo.RedirectStandardError = true;
                StartInfo.RedirectStandardInput = true;
                StartInfo.RedirectStandardOutput = true;

                StartInfo.CreateNoWindow = false;

                ServerProcess.StartInfo = StartInfo;
                ServerProcess.OutputDataReceived += ServerProcess_OutputDataReceived;
                ServerProcess.ErrorDataReceived += ServerProcess_ErrorDataReceived;

                ServerProcess.Start();
                ServerProcess.BeginOutputReadLine();
                ServerProcess.BeginErrorReadLine();


                ProcessID = ServerProcess.Id;


                IsStarted = true;
                while (IsStarted)
                    if (ServerProcess.HasExited)
                    {
                        IsStarted = false;
                        MessageBox.Show("Process has exited! Process ID: " + ProcessID);
                    }
            }
        }

        private void ServerProcess_ErrorDataReceived(object sender, DataReceivedEventArgs e)
        {
            Application.Current.Dispatcher.Invoke(() => { Output = e.Data; });
            //I want to append e.Data to the textbox in on the PlayPage.xaml which is where the Textbox is located
        }

        private void ServerProcess_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            Application.Current.Dispatcher.Invoke(() => { Output = e.Data; });
            //I want to append e.Data to the textbox in on the PlayPage.xaml which is where the Textbox is located
        }
    }
}

1 个答案:

答案 0 :(得分:0)

在Server类中实现接口INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    protected void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

然后在你的&#34;输出&#34; setter调用方法                 NotifyPropertyChanged();

根据代码的其余部分,您可能需要将视图的datacontext直接设置为服务器类,或者设置为xaml.cs类本身,然后将Text数据绑定更改为属性Server.Output