Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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
C# 双向绑定:在模型设定器中编辑从XAML控件传递的值不会更新控件_C#_Xaml_Mvvm_Windows 10_Uwp - Fatal编程技术网

C# 双向绑定:在模型设定器中编辑从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

这是针对Windows 10通用应用程序的

XAML:

视图模型:

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)
{
原始文本变量