C# 双向绑定:在模型设定器中编辑从XAML控件传递的值不会更新控件
这是针对Windows 10通用应用程序的 XAML: 视图模型:C# 双向绑定:在模型设定器中编辑从XAML控件传递的值不会更新控件,c#,xaml,mvvm,windows-10,uwp,C#,Xaml,Mvvm,Windows 10,Uwp,这是针对Windows 10通用应用程序的 XAML: 视图模型: private TrulyObservableCollection<TextBoxStrings> _textBoxList; public TrulyObservableCollection<TextBoxStrings> TextBoxList { get { return _textBoxList; } set { if (_t
private TrulyObservableCollection<TextBoxStrings> _textBoxList;
public TrulyObservableCollection<TextBoxStrings> TextBoxList
{
get { return _textBoxList; }
set
{
if (_textBoxList != value)
{
_textBoxList = value;
RaisePropertyChanged();
}
}
}
私人TrulyObservableCollection\u textBoxList;
public TrulyObservableCollection文本框列表
{
获取{return\u textBoxList;}
设置
{
if(_textBoxList!=值)
{
_textBoxList=值;
RaisePropertyChanged();
}
}
}
我从视图模型中将新的TextBoxString
对象添加到我的TextBoxList
集合中
我想让用户不能输入某些字符(或者更确切地说,他们在任何时候都会被删除)
这些都是输入的
这在模型中起作用。设置断点并查看值,模型中的一切都在工作:值进入setter并被更改,\u-boxText
保存从CheckBoxText()设置的新值;
但问题是,在我看来,文本框并不反映我在模型中对底层文本所做的更改。
因此,如果我在“tbox”中输入“abc*()”,模型中的值将是“abc”。然而,文本框的值仍然是“abc*()”
我有一种感觉,这与我正在编辑收藏中的项目有关,而我没有任何实现来处理收藏中更改的项目。我的印象是,使用INotifyPropertyChanged
和ObservableCollection
可以解决这一问题
有人有什么建议吗
谢谢大家!
编辑:所以,现在我尝试使用
trullyobservableCollection
,因为我认为这是个问题,但它没有帮助。这里是:你应该编辑BoxText
,然后将选中的值发送到用户界面。只需将值发送到CheckBoxText
,并且已经编辑的值应该分配到\uboxtext
。然后您应该通过调用RaisePropertyChanged(“BoxTest”)
将BoxText
发送到UI。请参阅以下代码片段:
private string _boxText;
public string BoxText
{
get { return _boxText; }
set
{
if (_boxText != value)
{
_boxText=CheckBoxText(value);
RaisePropertyChanged("BoxText");
}
}
}
对于放置在集合中的属性的一个属性,使用INotifyPropertyChanged
没有区别。对于集合和ListView的完整示例,您应该编辑BoxText
,然后将选中的值发送到UI。只需将value
发送到CheckBoxText
,并且已经是edited应分配给\u boxText
。然后您应通过调用RaisePropertyChanged(“BoxTest”)
将boxText
发送到UI。请参阅以下代码段:
private string _boxText;
public string BoxText
{
get { return _boxText; }
set
{
if (_boxText != value)
{
_boxText=CheckBoxText(value);
RaisePropertyChanged("BoxText");
}
}
}
对于放置在集合中的属性的一个属性使用INotifyPropertyChanged
没有区别。完整的示例包括集合和ListView
尝试将此更改为:
var tmp = CheckBoxText(value);
if (_boxText != tmp)
{
_boxText = tmp;
NotifyPropertyChanged();
}
我希望,在您的XAML中,对属性BoxText
的绑定是双向的,对吗
尝试将此更改为:
var tmp = CheckBoxText(value);
if (_boxText != tmp)
{
_boxText = tmp;
NotifyPropertyChanged();
}
我希望,在您的XAML中,对属性BoxText
的绑定是双向的,对吗
但问题是,在我看来,文本框并不反映我在模型中对底层文本所做的更改
如您所见,文本框确实反映了对模型的更改。当您在文本框中键入“abc*()”时,模型中的值将更改为“abc”。这里的问题是UWP中的绑定系统是“智能的”。对于双向绑定,对目标的更改将自动传播到源,在这种情况下,绑定系统假设PropertyChanged事件将为源中的相应属性触发,并忽略这些事件。因此,即使您有RaisePropertyChanged
或e> NotifyPropertyChanged
在您的源代码中,文本框仍然不会更新
在WPF中,我们可以调用强制更新。但是这种方法在UWP中不可用
作为一种解决方法,您应该能够使用检查输入,如下所示:
private void tbox_TextChanged(object sender, TextChangedEventArgs e)
{
var tb = sender as TextBox;
if (tb != null)
{
var originalText = tb.Text;
var r = new Regex("[^a-zA-Z0-9]+");
if (originalText != r.Replace(originalText, ""))
{
var index = (tb.SelectionStart - 1) < 0 ? 0 : (tb.SelectionStart - 1);
tb.Text = r.Replace(originalText, "");
tb.SelectionStart = index;
}
}
}
private void tbox\u TextChanged(对象发送者,textchangedventargs e)
{
var tb=发送方作为文本框;
如果(tb!=null)
{
var originalText=tb.Text;
var r=新正则表达式(“[^a-zA-Z0-9]+”);
if(originalText!=r.Replace(originalText,“”)
{
var指数=(tb.SelectionStart-1)<0?0:(tb.SelectionStart-1);
tb.Text=r.Replace(原文为“”);
tb.SelectionStart=索引;
}
}
}
然而,它可能会破坏你的MVVM模型,你可以使用数据验证来避免这种情况,这里有一个博客:你可以参考。我个人认为,数据验证是这种情况下更好的方向
但问题是,在我看来,文本框并不反映我在模型中对底层文本所做的更改
如您所见,文本框确实反映了对模型的更改。当您在文本框中键入“abc*()”时,模型中的值将更改为“abc”。这里的问题是UWP中的绑定系统是“智能的”。对于双向绑定,对目标的更改将自动传播到源,在这种情况下,绑定系统假设PropertyChanged事件将为源中的相应属性触发,并忽略这些事件。因此,即使您有RaisePropertyChanged
或e> NotifyPropertyChanged
在您的源代码中,文本框仍然不会更新
在WPF中,我们可以调用强制更新。但是这种方法在UWP中不可用
作为一种解决方法,您应该能够使用检查输入,如下所示:
private void tbox_TextChanged(object sender, TextChangedEventArgs e)
{
var tb = sender as TextBox;
if (tb != null)
{
var originalText = tb.Text;
var r = new Regex("[^a-zA-Z0-9]+");
if (originalText != r.Replace(originalText, ""))
{
var index = (tb.SelectionStart - 1) < 0 ? 0 : (tb.SelectionStart - 1);
tb.Text = r.Replace(originalText, "");
tb.SelectionStart = index;
}
}
}
private void tbox\u TextChanged(对象发送者,textchangedventargs e)
{
var tb=发送方作为文本框;
如果(tb!=null)
{
原始文本变量