当前位置:  开发笔记 > 编程语言 > 正文

UWP绑定到MVVM中的AutoSuggestBox

如何解决《UWP绑定到MVVM中的AutoSuggestBox》经验,为你挑选了2个好方法。

我在UWP中调用AutoSuggestBox控件的QuerySubmitted命令.该命令在视图模型中绑定到ICommand.问题是需要接受AutoSuggestBoxQuerySubmittedEventArgs这是纯UI,并且在MVVM中是不可接受的.

我的代码看起来像这样:


    
        
            
        
    

我的视图模型看起来像这样:

public DelegateCommand SearchCommand { get; }

public MainPageViewModel()
{
    SearchCommand = new DelegateCommand(ExecuteMethod);
}

private void ExecuteMethod(AutoSuggestBoxQuerySubmittedEventArgs o)
{
    // CODE HERE
}

ofcours AutoSuggestBoxQuerySubmittedEventArgs在视图模型中是不可接受的.寻找替代品......同样适用于SuggestionChosen ......



1> Nick..:

InvokeCommandAction有一个名为InputConverter的参数,您可以使用该参数将事件参数转换为可传递给ViewModel的其他参数.

首先创建一个IValueConverter类,从这样的事件args中提取你需要的东西: -

public class AutoSuggestQueryParameterConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
       {
          // cast value to whatever EventArgs class you are expecting here
          var args = (AutoSuggestBoxQuerySubmittedEventArgs)value;
          // return what you need from the args
          return (string)args.ChosenSuggestion;
       }
}

然后在您的XAML中使用该转换器,如下所示:


     



    
      
        
      
    

最后在viewmodel中更改命令以接受字符串作为参数.所以你的vm中会有以下内容:

public DelegateCommand SearchCommand { get; }

public MainPageViewModel()
{
    SearchCommand = new DelegateCommand(ExecuteMethod);
}

private void ExecuteMethod(string o)
{
    // CODE HERE
}



2> CFreitas..:

您可以将搜索字符串(Text属性)绑定到视图模型属性,将事件绑定到无参数方法.这样,视图模型就不必处理UI对象:

XAML:


代码背后:

public class MainPageViewModel : SomeViewModelBaseClass
{
    /* Boilerplate code and constructor not included */

    private string _SearchText;
    public string SearchText {/* getter and setter INotyfyPropertyChange compliant */ }

    private List _Usuals; // Initialized on constructor
    public string Usuals {/* getter and setter INotyfyPropertyChange compliant */ }


    public void FilterUsuals()
    {
        // the search string is in SearchText Example:
        Usuals = _UsualsStore.Where(u => u.Contains(_SearchText.ToLower())).ToList();
    }

    public void ProcessQuery() { /* TODO - search string is in SearchText */ }

    public void ProcessChoice() { /* TODO - search string is in SearchText */ }
}

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有