XAML,MVVM和TwoWay数据绑定

时间:2018-02-16 18:59:55

标签: wpf unit-testing xaml mvvm uwp-xaml

我有以下XAML。我正在使用UWP(通用Windows平台),但我想描述的问题也适用于其他XAML框架,如WPF:

<!-- MyVM is a ViewModel -->
<AutoSuggestBox
    QueryIcon="Find"
    TextChanged="{x:Bind MyVM.FilterTextChanged}" 
    Text="{x:Bind MyVM.FilterText, Mode=TwoWay}"/>

这就是它的工作原理:当用户在AutoSuggestBox中输入文字时,MyVM ViewModel会被告知每个关键笔划并使用FilterText过滤数据。

这就是MyVM的样子:

// Uses INotifyPropertyChanged from MVVMLight
private string filterText;
public string FilterText
{
    get { return filterText; }
    set { Set(ref filterText, value); }
}

public async void FilterTextChanged()
{
    await LoadData(); // uses FilterText to filter data
}

当我需要修改FilterText值时出现问题,例如清除它或设置预定义的过滤器。由于TwoWay绑定,AutoSuggestBox中的文本显示正确但作为“副作用”调用FilterTextChanged方法(因为文本已更改)。我不希望这种“副作用”。这有两个原因:

  1. 它使ViewModel依赖于View中的XAML。我的意思是,尽管我没有调用FilterTextChanged,但是当我设置FilterText值时,它被调用只是因为它在XAML中是双向绑定的。

  2. 无法进行自动化单元测试。如果没有XAML,ViewModel的行为会有所不同:当我设置FilterTextChanged值时,不会调用FilterText方法。

  3. 这是XAML,MVVM和TwoWay绑定的一般问题,不限于AutoSuggestBox的具体示例。

    如何解决这个问题?对我来说,主要的问题是如何进行单元测试?

1 个答案:

答案 0 :(得分:0)

  

当我需要修改FilterText值时出现问题,例如清除它或设置预定义的过滤器。由于TwoWay绑定,AutoSuggestBox中的文本正确显示,但作为&#34;副作用&#34;调用FilterTextChanged方法(因为文本已更改)。我不想要这个&#34;副作用&#34;。

如果我理解了您的问题,那么当您清空AutoSuggestBox或为其设置默认值时,您只是不希望调用FilterTextChanged。如果是这样,您不需要使用TextChanged来触发FilterTextChanged方法,您可以在属性值更改时调用它。

例如:

<AutoSuggestBox QueryIcon="Find" Text="{x:Bind MyVM.FilterText, Mode=TwoWay}"/>
private string filterText;
public string FilterText
{
    get { return filterText; }
    set
    {
        if (value != string.Empty || value != "default value")
        {
            FilterTextChanged();
        }
        filterText = value;
        RaisePropertyChanged("FilterText");
    }
}

public async void FilterTextChanged()
{
    await LoadData(); // uses FilterText to filter data
}