好的,所以我正在尝试将一些数据绑定到我的应用程序中的文本框,这就是它的样子。 我有一个带有文本框的Page.xaml(以及其他一些东西,但我们不关心那些,因为我们想要将数据绑定到文本框而不是其他任何东西)
我有一个叫做Server的类,这个类负责启动.jar文件和其他一些小问题。 当它启动进程时,它会启动一个BAT文件,你知道,这是一个cmd窗口。 然后我已经把它重定向到输出的位置,所以无论打印到cmd窗口我们想要捕获并附加到PlayPage.xaml上的文本框中,这是我之前提到的页面。
我遇到的问题是我想将来自cmd窗口的任何内容数据绑定到我的文本框,这是可能的,因为我之前已经完成了但是它不是通过使用数据绑定。
所以换句话说。发送到cmd窗口的文本我希望将其重定向到我的文本框。
这是一张图片,显示了打印到cmd窗口的文本(随着时间的推移,它会继续打印)
这是项目的结构
这是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
}
}
}
答案 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