none
MVVM模式中,文本框绑定了某值,在文本框中粘贴后,似乎就断开与UI联系? RRS feed

  • 问题

  • 先贴出代码

    XAML如下:

    <TextBox Name="tbx" Width="100" Height="20" Text="{Binding Name,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

    CS代码如下:

    public MainWindow()
            {
                InitializeComponent();
                this.DataContext = new Card() { Name = "" };
                tbx.Focus();
            }

    //==========================

        public class Card : INotifyPropertyChanged
        {
            string _name;
            public event PropertyChangedEventHandler PropertyChanged;

            public string Name
            {
                get { return _name; }
                set
                {
                    _name = value;
                    if (_name.Length >= 4)
                        Name = "";
                    OnPropertyChanged("Name");
                }
            }

            protected void OnPropertyChanged(string name)
            {
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                    handler(this, new PropertyChangedEventArgs(name));
            }
        }

    具体情况是这样的,我希望得到的结果是,在文本框中输入内容,超过4个字符则截断为空,程序启动后一切正常,在文本框中输入前3个字都正常,第四个字的时候,文本框的内容会被清空.

    但,如果我事先在剪贴板中放一段超过4个字符的文字,然后把它粘贴进文本框后,再在文本框中输入,则超过4个字符时,文本框中的内容不会被清空,不知道为什么会这样,请各位赐教

    2013年3月17日 7:38

答案

  • 确实是可以的,我测试过的,不过这个问题后来我想了想,大概猜到是怎么回事了

    当程序跑起来的时候,文本框的值是空,绑定的属性也是空,然后我拷贝粘贴了一个超过4字符长度的内容进去,程序一判断,把内容又变成空了,对于类来说,这个值是由""变成"",因此没有通知界面,而文本框中的内容却有了

    文本框有TextChange事件的,在那里做就可以了,用Converter也是可以的,至于限制字数长度,那不是我想要的,我的目的也并非是限制长度,而是得到指定长度的字串后,进行一个处理,然后再把文本框中的内容清理掉,等待下一次输入

    感谢您的回复

    2013年3月19日 1:07

全部回复

  • 补充一下

    if (_name.Length >= 4)
        Name = "";

    这一句,如果把 Name = ""改为Name = " ",则可以实现预期的效果,但不明白为什么会这样

    2013年3月17日 8:31
  • Hi,

    你确定把Name改成=“ ” 就可以?我怎么觉得不行啊。 你可以尝试下在Converter里进行判断操作。或者直接设置TextBox.MaxLength来限制字数啊。


    Cheers, Amy

    2013年3月18日 11:18
  • 确实是可以的,我测试过的,不过这个问题后来我想了想,大概猜到是怎么回事了

    当程序跑起来的时候,文本框的值是空,绑定的属性也是空,然后我拷贝粘贴了一个超过4字符长度的内容进去,程序一判断,把内容又变成空了,对于类来说,这个值是由""变成"",因此没有通知界面,而文本框中的内容却有了

    文本框有TextChange事件的,在那里做就可以了,用Converter也是可以的,至于限制字数长度,那不是我想要的,我的目的也并非是限制长度,而是得到指定长度的字串后,进行一个处理,然后再把文本框中的内容清理掉,等待下一次输入

    感谢您的回复

    2013年3月19日 1:07
  • 似乎是这么回事哈,受教了,谢谢~

    Cheers, Amy

    2013年3月19日 1:29