我有以下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
方法(因为文本已更改)。我不希望这种“副作用”。这有两个原因:
它使ViewModel依赖于View中的XAML。我的意思是,尽管我没有调用FilterTextChanged
,但是当我设置FilterText
值时,它被调用只是因为它在XAML中是双向绑定的。
无法进行自动化单元测试。如果没有XAML,ViewModel的行为会有所不同:当我设置FilterTextChanged
值时,不会调用FilterText
方法。
这是XAML,MVVM和TwoWay绑定的一般问题,不限于AutoSuggestBox
的具体示例。
如何解决这个问题?对我来说,主要的问题是如何进行单元测试?
答案 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
}