TextBox.Text OneWay绑定不响应ViewModel更新后面的代码

时间:2013-05-30 18:43:42

标签: mvvm windows-phone-8 windows-phone mvvm-light

我正在为我的View实现一个搜索(更恰当的“过滤器”)表单,该表单使用ApplicationBarIconButtons来驱动用户与表单的交互:一个搜索按钮,用于转换到显示该表单的VisualState,另一个用于清除当前过滤字符串值。接受过滤器的文本框绑定到ViewModel上的属性:

XAML

<toolkit:PhoneTextBox x:Name="txtSearch" Text="{Binding VisitsFilter, Mode=OneWay}" />

视图模型

private string _visitsFilter;
public string VisitsFilter
{
    get
    {
        return _visitsFilter;
    }
    set
    {
        _visitsFilter = value;
        RaisePropertyChanged("VisitsFilter");
        RebuildVisits();
    }
}

问题是ApplicationBarIconButtons实际上没有任何能力使用Commands或类似命令绑定到我的ViewModel上的点,因此我在其Click事件的代码隐藏处理程序中处理它们与它的交互。似乎不应该是那么大的交易......从页面的数据上下文中获取ViewModel并设置绑定属性的值:

代码背后

private VisitsViewModel ViewModel
{
    get
    {
        return this.DataContext as VisitsViewModel;
    }
}

private void abbClear_Click(object sender, EventArgs e)
{
    this.Focus();
    ViewModel.VisitsFilter = string.Empty;
}

如果您通过setter遵循上面的代码,您将看到我设置了私有字符串成员的值,然后引发属性已更改的事件。我实际上在我的View中有一个代码支持这个事件的代码,它正在执行关于使“清除”按钮可见或不可见的其他逻辑,但关键是它正在成功地监听该事件。但是,上面标记中的OneWay绑定不会更新PhoneTextBox上Text属性的值。

这里的断开连接在哪里?

1 个答案:

答案 0 :(得分:1)

  1. 你的setter中的方法可能花费的时间太长,或者做一些可能会弄乱UI线程的东西。在发布以响应您的PropertyChanged时的含义,它错过了更新的机会......
  2. 尝试删除RebuildVisits();来自二传手。如果这样做,并且这个假设是正确的,那么在另一个线程上执行RebuildVisits。

    public string VisitsFilter
    {
      get { return _visitsFilter; }
      set { 
             _visitsFilter = value;
             RaisePropertyChanged("VisitsFilter");
    
             Tasks.StartNew (() => { RebuildVisits();});
           }
        ....
    

    }

    2.如果它真的是单向绑定,那么你的更新就会搞乱。为什么不设置TextBox

    IsReadOnly =“True”     并将绑定设置为TwoWay