使用Caliburn.Micro.ReactiveUI进行ReactiveUI“引人注目的示例”搜索

肖恩

我有一个用Caliburn.Micro构建的现有Wpf应用程序,我想开始集成ReactiveUI。首先,我从Caliburn.Micro切换到Caliburn.Micro.ReactiveUI库。

我有一个ListBox,它使用Caliburn Micro的约定绑定到BindableCollection。我使用CM定位MyViewModel的视图,并使用EntityFramework执行搜索来填充BindableCollection。

我正在尝试实现所示的异步“引人注目的示例”,但是无论何时执行搜索,ReactiveUI.dll都会引发并未处理InvalidCastException。我没有任何详细信息,因为我没有ReactiveUI.pdb符号文件。我将BindableCollection属性包装在ObservableAsPropertyHelper中,以便在用户执行搜索时,ReactiveUI将更新BindableCollection,以便Caliburn.Micro可以像平常一样进行操作。

有人知道会导致无效的强制转换异常吗?我对CM有一定的经验,但是对Rx和RxUI完全是新手。因此,我可能会完全以错误的方式进行此操作。

以下是相关代码:

public class MainViewModel: ReactiveScreen
{
        private ObservableAsPropertyHelper<BindableCollection<MyViewModel>> _myViewModels;
        public BindableCollection<MyViewModel> MyViewModels
        {
            get { return _myViewModels.Value; }
        }

        [ImportingConstructor]
        public MainViewModel(IEventAggregator eventAggregator)
        {

            _myEntities = new myEntities();
            var searchService = new SearchService(_myEntities);
            Items.CollectionChanged += delegate
            {
                NotifyOfPropertyChange(() => Status);
            };
            var searchTerms = this
                .ObservableForProperty(x => x.SearchTerm)
                .Value()
                .Throttle(TimeSpan.FromSeconds(.5));
            var searchResults = searchTerms.SelectMany(searchTerm => searchService.SearchAsync(searchTerm));
            var latestMatches = searchTerms
               .CombineLatest(searchResults,
                   (searchTerm, searchResult) =>
                       searchResult.SearchTerm != searchTerm
                           ? null
                           : searchResult.Matches)
               .Where(matches => matches != null);
            _myViewModels= latestMatches.ToProperty(this, x => x.MyViewModels);

        }
}

SearchService看起来像这样:

public class SearchService
    {
        private MyEntities _myEntities;
        public SearchService(MyEntities myEntities)
        {
            _myEntities= myEntities;
        }
        public async Task<SearchResult> SearchAsync(string searchTerm)
        {
            var query = await (from m in _myEntities.Employees select m).ToListAsync();
            if (!String.IsNullOrEmpty(searchTerm))
            {
                searchTerm = searchTerm.Trim();
                query = (List<Employee>) query.Where(
                    x => x.LastName.Contains(searchTerm) || x.FirstName.Contains(searchTerm))
                    .Select(x => x);
            }
            return new SearchResult
            {
                SearchTerm = searchTerm,
                Matches = new BindableCollection<MyViewModel>(query.Select(x => new MyViewModel{ Employee = x }))
            };

        }
    }

搜索结果:

public class SearchResult
    {
        public string SearchTerm { get; set; }
        public BindableCollection<MyViewModel> Matches { get; set; }
    }

谢谢,

肖恩

编辑:

在将断点设置在其他位置后,我详细了解了异常情况。

信息:

{“在对象(通常是ObservableAsPropertyHelper)上发生了OnError,它将破坏绑定或命令。为防止这种情况,请订阅对象的ThrownExceptions属性”}

内部异常:

{“无法转换类型WhereSelectListIterator 2[HR.DataContext.Models.Employee,HR.DataContext.Models.Employee]' to type System.Collections.Generic.List1 [HR.DataContext.Models.Employee]'的对象。”}

堆栈跟踪:

at ReactiveUI.RxApp.<>c__DisplayClass5.<.cctor>b__2()
   at System.Reactive.Concurrency.Scheduler.Invoke(IScheduler scheduler, Action action)
   at System.Reactive.Concurrency.DispatcherScheduler.<>c__DisplayClass1`1.<Schedule>b__0()
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
谜团

您的问题就在网上:

query = (List<Employee>)
    query
        .Where(x => x.LastName.Contains(searchTerm)
            || x.FirstName.Contains(searchTerm))
        .Select(x => x);

查询的类型似乎是List<Employee>,但query.Where(...).Select(...)返回的类型却不是。

您需要.ToList()在末尾添加一个它看起来应该像这样:

query = //(List<Employee>) no need to cast now
    query
        .Where(x => x.LastName.Contains(searchTerm)
            || x.FirstName.Contains(searchTerm))
        .ToList();

我删除了.Select(x => x)因为它没有执行任何操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Caliburn.Micro进行导航服务?

来自分类Dev

如何使用Caliburn.Micro进行导航服务?

来自分类Dev

使用Caliburn.Micro的动作

来自分类Dev

使用Caliburn.Micro在Windows Phone上进行Facebook身份验证回调

来自分类Dev

使用Caliburn Micro在WPF中对DataGrid选定的行进行按钮操作

来自分类Dev

在UWP中使用Caliburn.Micro从构造函数进行异步方法调用

来自分类Dev

使用Caliburn.Micro重用视图实例

来自分类Dev

使用Caliburn Micro在WPF中更新DataGrid

来自分类Dev

使用caliburn micro的组合框绑定错误

来自分类Dev

Caliburn Micro - 使用 IResult 和渲染视图

来自分类Dev

Caliburn Micro Datagrid绑定

来自分类Dev

Caliburn Micro发布/订阅

来自分类Dev

Caliburn Micro,聚焦MV

来自分类Dev

仅Caliburn.Micro Xamarin示例缺少参考或指令

来自分类Dev

不引人注目的javascript确认使用引导模态(bootbox)

来自分类Dev

Rails 4 update_attribute使用不引人注目的JavaScript

来自分类Dev

不引人注目的JavaScript无法与AJAX加载的内容一起使用

来自分类Dev

Caliburn Micro在使用MEF时找不到MainView

来自分类Dev

使用Caliburn.Micro从ViewModel调用UserControl的方法

来自分类Dev

使用Caliburn Micro从视图模型中的属性名称获取控制

来自分类Dev

一起使用F#和Caliburn.Micro

来自分类Dev

使用Caliburn Micro&Ninject设置依赖项注入

来自分类Dev

使用Caliburn.Micro的单实例WPF应用程序

来自分类Dev

从ViewModel使用Caliburn Micro显示MetroWindow弹出窗口

来自分类Dev

使用Caliburn.Micro将图像绑定到Uri

来自分类Dev

使用Caliburn.Micro附加到多个事件

来自分类Dev

使用Caliburn.Micro的视图模型中的气泡事件

来自分类Dev

使用ModernUI + Caliburn.Micro组合重新实现WindowManager

来自分类Dev

使用Caliburn Micro 2和Windows Phone 8.1的NavigateToViewModel

Related 相关文章

  1. 1

    如何使用Caliburn.Micro进行导航服务?

  2. 2

    如何使用Caliburn.Micro进行导航服务?

  3. 3

    使用Caliburn.Micro的动作

  4. 4

    使用Caliburn.Micro在Windows Phone上进行Facebook身份验证回调

  5. 5

    使用Caliburn Micro在WPF中对DataGrid选定的行进行按钮操作

  6. 6

    在UWP中使用Caliburn.Micro从构造函数进行异步方法调用

  7. 7

    使用Caliburn.Micro重用视图实例

  8. 8

    使用Caliburn Micro在WPF中更新DataGrid

  9. 9

    使用caliburn micro的组合框绑定错误

  10. 10

    Caliburn Micro - 使用 IResult 和渲染视图

  11. 11

    Caliburn Micro Datagrid绑定

  12. 12

    Caliburn Micro发布/订阅

  13. 13

    Caliburn Micro,聚焦MV

  14. 14

    仅Caliburn.Micro Xamarin示例缺少参考或指令

  15. 15

    不引人注目的javascript确认使用引导模态(bootbox)

  16. 16

    Rails 4 update_attribute使用不引人注目的JavaScript

  17. 17

    不引人注目的JavaScript无法与AJAX加载的内容一起使用

  18. 18

    Caliburn Micro在使用MEF时找不到MainView

  19. 19

    使用Caliburn.Micro从ViewModel调用UserControl的方法

  20. 20

    使用Caliburn Micro从视图模型中的属性名称获取控制

  21. 21

    一起使用F#和Caliburn.Micro

  22. 22

    使用Caliburn Micro&Ninject设置依赖项注入

  23. 23

    使用Caliburn.Micro的单实例WPF应用程序

  24. 24

    从ViewModel使用Caliburn Micro显示MetroWindow弹出窗口

  25. 25

    使用Caliburn.Micro将图像绑定到Uri

  26. 26

    使用Caliburn.Micro附加到多个事件

  27. 27

    使用Caliburn.Micro的视图模型中的气泡事件

  28. 28

    使用ModernUI + Caliburn.Micro组合重新实现WindowManager

  29. 29

    使用Caliburn Micro 2和Windows Phone 8.1的NavigateToViewModel

热门标签

归档