我目前正在为我的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属性的值。

断开在哪里?

最佳答案

  • 您的setter中的方法可能花费的时间太长,或执行的操作可能会干扰UI线程。意思是当它发布以响应您的PropertyChanged时,它错过了更新的机会...

  • 尝试删除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/

    10-14 23:34
    查看更多