我目前正在为我的View实现一个搜索(更恰当的“过滤器”)窗体,该窗体使用ApplicationBarIconButtons来驱动用户与该窗体的交互:一个搜索按钮,用于转换为带有显示的窗体的VisualState,一个用于清除当前过滤器字符串值的窗体。接受过滤器的文本框绑定(bind)到ViewModel的属性:
XAML
<toolkit:PhoneTextBox x:Name="txtSearch" Text="{Binding VisitsFilter, Mode=OneWay}" />
ViewModel
private string _visitsFilter;
public string VisitsFilter
{
get
{
return _visitsFilter;
}
set
{
_visitsFilter = value;
RaisePropertyChanged("VisitsFilter");
RebuildVisits();
}
}
问题在于,ApplicationBarIconButtons实际上没有任何通过Commands或类似命令绑定(bind)到ViewModel上的点的功能,因此我在其Click事件的处理程序中的代码中处理了与它的交互。似乎没什么大不了的……从页面的数据上下文中获取ViewModel并设置bound属性的值:
后面的代码
private VisitsViewModel ViewModel
{
get
{
return this.DataContext as VisitsViewModel;
}
}
private void abbClear_Click(object sender, EventArgs e)
{
this.Focus();
ViewModel.VisitsFilter = string.Empty;
}
如果您通过 setter 遵循上面的代码,您将看到我设置了私有(private)字符串成员的值,然后引发该属性已更改的事件。实际上,我的 View 中实际上有一个订阅该事件的代码,它在执行其他有关使“清除”按钮可见或不可见的逻辑,但关键是它正在成功监听该事件。但是,上面标记中的OneWay绑定(bind)不会更新PhoneTextBox上Text属性的值。
断开在哪里?
最佳答案
尝试删除RebuildVisits();来自二传手。如果这样可行,并且此假设正确,则在另一个线程上执行RebuildVisits。
public string VisitsFilter
{
get { return _visitsFilter; }
set {
_visitsFilter = value;
RaisePropertyChanged("VisitsFilter");
Tasks.StartNew (() => { RebuildVisits();});
}
....
}
2.如果这确实是一种单向绑定(bind),那会干扰您的更新。为什么不设置文本框
IsReadOnly =“真实”
并将绑定(bind)设置为TwoWay
关于mvvm - TextBox.Text OneWay绑定(bind)不响应ViewModel更新背后的代码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16843656/