从 class 编辑文本框的内容

Editing content of textbox from a class

我对使用 C# 进行编程还很陌生,我正在尝试更改主窗体中名为“ClientWindow”的文本框的值,该文本框称为 ClientConsoleTextBox。我试过这样做:

public static string ClientConsoleText;

然后当 ClientConsoleTextBox 初始化时,我在事件属性中设置如下:

private void ClientConsoleTextBox_Initialized(object sender, EventArgs e)
 {
    ClientConsoleTextBox.Text = ClientConsoleText;
 }

我可以更改字符串“ClientConsoleText”,但“ClientConsoleTextBox.Text”字符串永远不会更新为我可能添加到字符串 ex.Button 的任何文本:

private void TestButton_Click(object sender, RoutedEventArgs e)
{
   ClientConsoleText += "TestString";
}

目标是更新来自其他 类 的文本。

我曾尝试寻找答案,但其中 none 以清晰的方式分解了问题。 有人说我必须创建一个新的主实例 window..?

再次。抱歉,如果解决方案很明显但我似乎无法理解,我一周前开始使用 C# 和 wpf :)

提前致谢,祝您愉快!

您描述的功能是数据绑定,您必须有一个 class,将 ClientConsoleText 作为 属性,然后设置一个指向 class 的数据源。

一种更简单的方法,但我不知道它是否能满足您的目标,即在表单级别设置一个名为 ClientConsoleText 的 属性 来读取和写入文本框。

示例代码:

 public string ClientConsoleText
    {
        get { return ClientConsoleTextBox.Text; }
        set { ClientConsoleTextBox.Text = value; }
    }

现在,如果您指定 ClientConsoleText = "hello",则文本框中将出现“hello”。 也可以通过引用ClientConsoleText获取textbox的值,Example:

string s = ClientConsoleText;

希望这对您有所帮助。如果不是,也许你可以解释一下目标是什么。

我最终像这样创建了一个计时器:

        private void ClientConsoleTextBox_Initialized(object sender, EventArgs e)
        {
            DispatcherTimer timer = new DispatcherTimer();
            timer.Interval = TimeSpan.FromMilliseconds(100);
            timer.Tick += timer_Tick;
            timer.Start();

        }

然后每 100 毫秒它将:

        void timer_Tick(object sender, EventArgs e)
        {
            ClientConsoleTextBox.Text = ClientConsoleText;
        }

本质上,它自己更新文本框! 也许这是一个糟糕的设计选择,但这对我有用,希望这对以后的人有所帮助:)晚安。

您应该使用 TextBox.Text 属性 来更新 UI,

ClientConsoleText += "TestString";
ClientConsoleTextBox.Text = ClientConsoleText; 

或者实现INotifyPropertyChanged接口,使用绑定更新UI

   public class SimpleViewModel : INotifyPropertyChanged
   {
    private string myText;

    public string MyText
    {
        get
        {
            return myText;
        }
        set
        {
            myText = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("MyText")));
        }
    }


    public event PropertyChangedEventHandler PropertyChanged;
  }

MainWindow.Xaml

<Window x:Class="WpfApp2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp2"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<StackPanel>
    <!--Binding to SimpleViewModel.MyText-->
    <TextBox  Text="{Binding MyText}"/>
    <Button Content="Update" Click="Button_Click"/>
</StackPanel>

MainWindow.cs

public partial class MainWindow : Window
{
    SimpleViewModel viewmodel = new SimpleViewModel();

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = viewmodel();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        //get  textbox value 
        var text = viewmodel.MyText;

        //set textbox value
        viewmodel.MyText = "HelloWorld";
    }
}