【问题标题】:Databinding RichTextBox.Text to a String将 RichTextBox.Text 数据绑定到字符串
【发布时间】:2017-12-11 23:00:55
【问题描述】:

尝试将 String 绑定到 RichTextBox.Text 属性,以便当 String 值更改时,该更改会反映在 RichTextBox 中。到目前为止,我没有成功。

string test = "Test";
rtxt_chatLog.DataBindings.Add("Text",test,null);
test = "a";

这会在 rtxt_chatLog 中显示“Test”,而不是“a”。

甚至尝试添加 rtxt_chatLog.Refresh();但这没有任何区别。

更新 1: 这也不起作用:

public class Test
{
    public string Property { get; set; }
}

Test t = new Test();
t.Property = "test";
rtxt_chatLog.DataBindings.Add("Text", t, "Property");
t.Property = "a";

我没有正确理解数据绑定吗?

【问题讨论】:

  • 你绑定硬编码字符串的目的是什么。你不想在绑定方面走相反的方向吗?你真正想要实现什么?您是否希望某些人输入的动态数据(例如编辑框)绑定到 ChatLog,或者您是否真的想将数据附加到 ChatLog..?
  • 您按值绑定,而不是按引用绑定。这意味着只有test ("Test") 的当前值被传递,变量test 的任何更改都不会影响文本框。
  • 想达到什么目的?好吧,我想在一个窗口(幕后)中以字符串形式保存消息日志,然后根据用户的要求,弹出另一个窗口,该窗口将实时列出父表单中字符串的内容。我希望窗口更新,因为父表单中的字符串已更新。代码 sn-p 是我测试绑定的方式。
  • 贾斯汀,我将如何通过引用绑定?

标签: c# winforms string data-binding richtextbox


【解决方案1】:

String 类没有实现 INotifyPropertyChanged,因此绑定源没有事件告诉 RichTextBox 发生了变化。

尝试使用实现的INotifyPropertyChanged 更新您的课程:

public class Test : INotifyPropertyChanged {
  public event PropertyChangedEventHandler PropertyChanged;

  private string _PropertyText = string.Empty;

  public string PropertyText {
    get { return _PropertyText; }
    set {
      _PropertyText = value;
      OnPropertyChanged("PropertyText");
    }
  }

  private void OnPropertyChanged(string propertyName) {
    if (PropertyChanged != null)
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
  }

}

此外,DataBinding 似乎不喜欢属性名称的名称“属性”。尝试将其更改为“属性”以外的其他内容。

rtxt_chatLog.DataBindings.Add("Text", t, "PropertyText");

【讨论】:

  • 是的,这行得通,我确实看到了有关该界面的一些信息,但希望不需要它。
【解决方案2】:

为什么不只为字符串变量设置一个属性并始终通过属性处理字符串?在 setter 下更简单:rtxt_chatLog.Text = test;

编辑:来自 OP:Well, I want to keep a log of messages in a string in one window (behind the scenes) and then, at user's request, pop up another window that will list the contents of the string from the parent form in real time

如果您只想在用户请求时列出字符串的内容,那么您不需要所有这些。只需要处理用户的请求并在该事件下执行rtxt_chatLog.Text = test(可能是一些事件处理程序)。但是,如果您需要用字符串的每个新值填充您的 Richtextbox,您可以做一些简单的事情:

public string Test
{
    set
    { 
        test = value; 
        rtxt_chatLog.Text = test;
    }
    get { return test; }
}

这里的关键是只使用属性通过out来设置变量test的值。例如,在您的代码中不要这样做

test = "sdf";

Test = "sdf";

简单。

【讨论】:

  • 我被你写的东西弄糊涂了,无法理解。哪个属性与哪个字符串一起使用,等等。但是如果您查看我对我的问题的第一条评论,您会看到我需要这个,并且您展示的代码示例似乎无法解决问题。
  • 不完全是,除非我们一开始的想法非常不同。 rtxt_chatLog 是我的主要表单的一部分,它有自己的独立功能,但我暂时将其用于绑定测试。根据用户的要求,我想弹出一个带有它自己的 RichTextBox 的窗口,该窗口将显示我在应用程序的整个生命周期中一直附加的字符串的内容。因此,按照我的想法,第二个 RichTextBox 在用户选择查看消息之前不会存在,否则这些消息会在应用程序启动时在后台累积。
  • 鉴于我必须创建一个实现 INotifyChangeProperty 的单独对象,我看到实际上至少有两种其他方法可以解决我的问题。我可以让弹出窗口公开它的 RichTextBox 并将其注册到我的主窗体中,以便它由主窗体中的代码填充。或者,我可以创建自己的事件,这将允许我在订阅者中创建更灵活的事件处理程序,而不是使用预定义的 PropertyChangeEventHandler。
  • @user983110 //根据用户的请求,我想弹出一个带有它自己的 RichTextBox 的窗口,它将显示我在应用程序的整个生命周期中一直附加的字符串的内容。所以,按照我的想法,直到用户选择查看消息,第二个 RichTextBox 才会存在, // 在那种情况下,为什么要动态更新富文本框?只有当用户尝试打开弹出窗口时才需要它。所以在那一刻,你为什么不使用当前字符串加载richttextbox?我们似乎相处得不太好:)
  • :) 因为我希望请求的窗口在打开时使用新消息更新自身。我不希望弹出窗口有静态数据。如果用户想在做他/她可以做的其他事情时看到这些消息,如果用户不感兴趣,那么只需关闭或永远不要打开该弹出窗口。
猜你喜欢
  • 2012-04-20
  • 2011-06-18
  • 1970-01-01
  • 1970-01-01
  • 2013-02-18
  • 1970-01-01
  • 2017-11-03
  • 1970-01-01
  • 2017-07-07
相关资源
最近更新 更多