Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 从Viewmodel更改的文本框值未反映在UI上_Wpf_Mvvm_Dependency Properties - Fatal编程技术网

Wpf 从Viewmodel更改的文本框值未反映在UI上

Wpf 从Viewmodel更改的文本框值未反映在UI上,wpf,mvvm,dependency-properties,Wpf,Mvvm,Dependency Properties,我有一个文本框,文本绑定到ViewModel中的属性。用户可以手动输入文本,也可以从剪贴板粘贴文本。 我解析用户输入的文本(我使用UpdateSourceTrigger=PropertyChanged),并用换行符拆分文本 问题:当用户点击回车键时,一切正常。但是,当我试图处理粘贴的文本时,只要看到第一个“\n”,我就会尝试将其拆分为不同的字符串并清除文本框。在ViewModel中,文本设置为string.empty,但它不会反映在UI上 代码中有什么错误?我知道在自己的setter属性中编辑文

我有一个文本框,文本绑定到ViewModel中的属性。用户可以手动输入文本,也可以从剪贴板粘贴文本。 我解析用户输入的文本(我使用UpdateSourceTrigger=PropertyChanged),并用换行符拆分文本

问题:当用户点击回车键时,一切正常。但是,当我试图处理粘贴的文本时,只要看到第一个“\n”,我就会尝试将其拆分为不同的字符串并清除文本框。在ViewModel中,文本设置为string.empty,但它不会反映在UI上

代码中有什么错误?我知道在自己的setter属性中编辑文本并不是很好的编码实践,但是我怎么能不这样做呢

以下是代码片段:

XAML


视图模型:

     public string TextBoxData
        {
            get
            {
                return _textBoxData;
            }
            set
            {
                _textBoxData = value;
                RaisePropertyChanged("TextBoxData");
                if(_textBoxData != null && _textBoxData.Contains("\n"))
                {
                    OnNewLineCommandEvent(null);
                }
            }
        }

    public DelegateCommand<string> OnNewLineCommand
    {
        get
        {
            if (_onNewLineCommand == null)
            {
                _onNewLineCommand = new DelegateCommand<string>(OnNewLineCommandEvent);
            }
            return _onNewLineCommand;
        }
    }

    private void OnNewLineCommandEvent(string obj)
    {
        if (_textBoxData != null && _textBoxData.Length > 0)
        {
            List<string> tbVals = _textBoxData.Split('\n').ToList();
            foreach (string str in tbVals)
            {
                ListBoxItems.Add(new UnitData(str.Trim()));
            }
            TextBoxData = string.Empty;
        }
    }
公共字符串TextBoxData
{
得到
{
返回_textBoxData;
}
设置
{
_textBoxData=值;
RaisePropertyChanged(“TextBoxData”);
如果(_textBoxData!=null&&u textBoxData.Contains(“\n”))
{
OnNewLineCommandEvent(null);
}
}
}
公共DelegateCommand OnNewLineCommand
{
得到
{
如果(_onNewLineCommand==null)
{
_onNewLineCommand=新的DelegateCommand(OnNewLineCommandEvent);
}
返回ONNEWLINE命令;
}
}
私有void onnelinecommandevent(字符串obj)
{
如果(_textBoxData!=null&&u textBoxData.Length>0)
{
List tbVals=_textBoxData.Split('\n').ToList();
foreach(TBVAL中的字符串str)
{
添加(新的UnitData(str.Trim());
}
TextBoxData=string.Empty;
}
}
谢谢


RDV

我解决了这个问题。如果我尝试在其setter中修改textbox值,并且该值没有更改,则它不会反映在UI上。下面可能有助于更好地解释这一点:

  • 最初,当UI启动时,VM中的文本框值设置为“ABC”
  • 用户将此值从UI更改为“XYZ”
  • 在VM setter中,程序员检查textbox值是否为“XYZ”,然后将其更改回“ABC”-->在我的例子中,这是失败的。VM中textbox的值已更改为“ABC”,但UI仍将显示“XYZ”
  • 解决方案:在VM中,不要将值设置回“ABC”,而是将其设置为“ABC”(注意额外的空间)->这将更改UI值

    更新的虚拟机代码:

            private bool _isTextValChanged = false;
        private void OnNewLineCommandEvent(string obj)
        {
            if (_textBoxData != null && _textBoxData.Length > 0)
            {
                List<string> tbVals = _textBoxData.Split('\n').ToList();
                foreach (string str in tbVals)
                {
                    ListBoxItems.Add(new UnitData(str.Trim()));
                }
                //This will toggle textbox value and updated value will be reflected on the UI.
                if (_isTextValChanged)
                    TextBoxData = " ";
                else
                    TextBoxData = string.Empty;
    
                _isTextValChanged = !_isTextValChanged;
            }
        }
    
    private bool\u isTextValChanged=false;
    私有void onnelinecommandevent(字符串obj)
    {
    如果(_textBoxData!=null&&u textBoxData.Length>0)
    {
    List tbVals=_textBoxData.Split('\n').ToList();
    foreach(TBVAL中的字符串str)
    {
    添加(新的UnitData(str.Trim());
    }
    //这将切换文本框值,更新后的值将反映在UI上。
    如果(_isTextValChanged)
    TextBoxData=“”;
    其他的
    TextBoxData=string.Empty;
    _isTextValChanged=!\u isTextValChanged;
    }
    }
    
    谢谢


    RDV

    我解决了这个问题。如果我尝试在其setter中修改textbox值,并且该值没有更改,则它不会反映在UI上。下面可能有助于更好地解释这一点:

  • 最初,当UI启动时,VM中的文本框值设置为“ABC”
  • 用户将此值从UI更改为“XYZ”
  • 在VM setter中,程序员检查textbox值是否为“XYZ”,然后将其更改回“ABC”-->在我的例子中,这是失败的。VM中textbox的值已更改为“ABC”,但UI仍将显示“XYZ”
  • 解决方案:在VM中,不要将值设置回“ABC”,而是将其设置为“ABC”(注意额外的空间)->这将更改UI值

    更新的虚拟机代码:

            private bool _isTextValChanged = false;
        private void OnNewLineCommandEvent(string obj)
        {
            if (_textBoxData != null && _textBoxData.Length > 0)
            {
                List<string> tbVals = _textBoxData.Split('\n').ToList();
                foreach (string str in tbVals)
                {
                    ListBoxItems.Add(new UnitData(str.Trim()));
                }
                //This will toggle textbox value and updated value will be reflected on the UI.
                if (_isTextValChanged)
                    TextBoxData = " ";
                else
                    TextBoxData = string.Empty;
    
                _isTextValChanged = !_isTextValChanged;
            }
        }
    
    private bool\u isTextValChanged=false;
    私有void onnelinecommandevent(字符串obj)
    {
    如果(_textBoxData!=null&&u textBoxData.Length>0)
    {
    List tbVals=_textBoxData.Split('\n').ToList();
    foreach(TBVAL中的字符串str)
    {
    添加(新的UnitData(str.Trim());
    }
    //这将切换文本框值,更新后的值将反映在UI上。
    如果(_isTextValChanged)
    TextBoxData=“”;
    其他的
    TextBoxData=string.Empty;
    _isTextValChanged=!\u isTextValChanged;
    }
    }
    
    谢谢


    RDV

    您的ViewModel是否实现INotifyPropertyChanged?您是否尝试在setter中的OnNewLineCommandEvent之后调用RaisePropertyChanged?是的,我的VM实现INotifyPropertyChanged-它被称为RaisePropertyChanged。是的,我试着在OnNewLineCommandEvent之后调用RaisePropertyChanged,但它没有帮助您的代码完全按照它的原样为我工作。我不相信小精灵,所以你的代码和我的代码一定有点不同。这种类型的错误最常见的方式是DataContext不是您所认为的那样——而且我没有足够的代码来知道XAML代码片段的DataContext来源。如果您在setter中为
    TextBoxData
    设置断点,那么当您在textbox中键入时,它肯定会被击中吗?让我们先假设在大项目中有某种特定的东西导致了特定的问题。如果“事情变慢”到永远不会调用事件处理程序的地步,我几乎不认为该应用程序是可用的。你在大项目中尝试过绑定跟踪吗?在大型项目中,如果给
    TextBoxData
    一个默认值(“诸如此类”),该值是否会出现在中的文本框中