AutoSuggestBox (UWP) 在使用 Reactive 时通过代码隐藏绑定 UI

AutoSuggestBox (UWP) binding through code behind when using Reactive UI

Reactive UI 文档建议使用代码隐藏绑定而不是 XAML 绑定以避免内存泄漏。我正在尝试将视图模型中存在的 SearchCommand 绑定到 AutoSuggestBox.

SearchView.xaml

<AutoSuggestBox x:Name="SearchBox" QueryIcon="Find"/>

SearchView.xaml.cs

this.BindCommand(ViewModel,
    viewModel => viewModel.SearchCommand,
    view => view.SearchBox);

但是这不起作用,命令不会被调用。我也尝试绑定 QuerySubmitted 事件,但我在下面的 Events() 中找不到它。我用了 ReactiveUI.Events

SearchView.xaml.cs

this.Events().QuerySubmitted
    .InvokeCommand(this, x => x.ViewModel.SearchCommand)

我没有尝试直接绑定命令,但通常我绑定到 属性 然后监听变化。

this.Bind(ViewModel,
viewModel => viewModel.SearchTerm,
view => view.SearchBox);

然后在您的视图模型中

private string _searchTerm;

public string SearchTerm
{
    get => _searchTerm;
    set => this.RaiseAndSetIfChanged(ref _searchTerm, value);
}

然后在构造函数内部

this.WhenAnyValue(x => x.SearchTerm).Subscribe(_ => SearchCommand());

这没有经过测试,甚至可能不是最好的方法,但这就是我一直在做的

要访问 QuerySubmitted 事件,您需要执行 SearchBox.Events().QuerySubmitted。至于 BindCommand,您可能必须明确指定您希望命令绑定到哪个事件。您可以使用名为 toEvent 的可选字符串参数来做到这一点:nameof(SearchBox.QuerySubmitted)