【问题标题】:Binding TextBox to part of a string将 TextBox 绑定到字符串的一部分
【发布时间】:2013-01-01 09:21:20
【问题描述】:

我有一个字符串保存到由两个文本框编译并由. 分隔的数据库中,例如如果一个TextBox2 而另一个有5,则2.5 被保存到数据库中。

我现在遇到的问题是加载已保存的答案。无论如何将TextBox.Text绑定到字符串的某个字符(即第一个文本框将始终是SavedAnswer[0],另一个将是SavedAnswer[2])或者我必须创建一个转换器,传递完整的答案然后解析?

【问题讨论】:

  • 我认为可以这样做(或者我不明白): textBox1.Text = savedAnswer[0].ToString(); textBox2.Text = savedAnswer[2].ToString();
  • SiLo 的答案是要走的路。通常,View-Model 是您的 View 的逻辑模型;它的职责是将模型中的数据转换为视图的可绑定属性。

标签: c# binding textbox


【解决方案1】:

有几种方法可以解决。最简单的方法是让您的模型具有两个相关的属性,您可以分别绑定它们。重要的部分是确保他们触发了 PropertyChanged 事件,以便 Binding 在 UI 上正常工作以反映更改。

例子:

public class MyModel : INotifyPropertyChanged
{
  string fullAnswer;

  public event PropertyChangedEventHandler PropertyChanged;

  public string FullAnswer
  {
    get { return fullAnswer; }
    set
    {
      if(string.Equals(value, fullAnswer)) return; // skip for equal values

      fullAnswer = value;
      OnPropertyChanged("FullAnswer");
      OnPropertyChanged("Answer1");
      OnPropertyChanged("Answer2");
    }
  }

  public string Answer1
  {
    get
    {
      if(fullAnswer == null) return null;

      var tokens = fullAnswer.Split('.');
      if(tokens.Length < 1) return string.Empty;

      return tokens[0];
    }
  }

  public string Answer2
  {
    get
    {
      if(fullAnswer == null) return null;

      var tokens = fullAnswer.Split('.');
      if(tokens.Length < 2) return string.Empty;

      return tokens[1];
    }
  }

  protected void OnPropertyChanged(string propertyName)
  {
    var handler = this.PropertyChanged;

    if(handler != null)
      handler(this, new PropertyChangedEventArgs(propertyName));
  }
}

【讨论】:

  • 谢谢!这似乎正是我所需要的。问题,如果. 之前和/或之后没有值(即两个TextBoxes 中都没有输入文本),调用Split 时会抛出异常吗?
  • 谢谢!我打算使用str.Length() 来确定是否输入了值,我什至没有考虑计算令牌;干净多了!
  • 没问题。它仍然稍微低效,因为它至少执行两次string.Split()(每个子答案属性一次)。更不用说它没有缓存结果,所以每次通过get 检索属性时,它都会再次执行string.Split()。幸运的是,这种情况不应该经常发生,因为 Binding 只有在注意到更改后才会获得值。
【解决方案2】:

假设你的字符串被命名为“str”并且总是包含“.”人物:

TextBox1.Text = str.Split('.')[0];
TextBox2.Text = str.Split('.')[1];

或者:

string[] SavedAnswer = str.Split('.');
TextBox1.Text = SavedAnswer [0];
TextBox2.Text = SavedAnswer [1];

【讨论】:

    【解决方案3】:

    使用这三个属性。

    public string FullNumber
    {
        get
        {
            if (String.IsNullOrEmpty(DecimalPart)) {
                return IntegerPart;
            } else if (String.IsNullOrEmpty(IntegerPart)) {
                return "0." + DecimalPart;
            }
            return IntegerPart + "." + DecimalPart;
        }
        set
        {
            if (String.IsNullOrEmpty(value)) {
                IntegerPart = "";
                DecimalPart = "";
            } else if (value.Contains(".")) {
                string[] parts = value.Split('.');
                IntegerPart = parts[0];
                DecimalPart = parts[1];
            } else {
                IntegerPart = value;
                DecimalPart = "";
            }
        }
    }
    
    public string IntegerPart { get; set; }
    public string DecimalPart { get; set; }
    

    FullNumber 可用于获取和设置完整号码,因此在从数据库读取号码或将号码保存到数据库时使用。 IntegerPartDecimalPart 属性将绑定到两个文本框。如果您不想使用数据绑定,可以删除这两个属性,并在 FullNumber 属性的代码中的任何位置将 IntegerPart 替换为 textBox1.TextDecimalPart 替换为 textBox2.Text

    无论数字为空还是null 以及是否包含小数点,这都有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-02
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 2019-06-06
      • 2017-06-06
      • 1970-01-01
      相关资源
      最近更新 更多