Условия гонки с использованием данных Dynami c - PullRequest
0 голосов
/ 31 марта 2020

В настоящее время я пытаюсь отобразить дерево с помощью библиотеки данных Dynami c с UWP.

Моя проблема заключается в том, что если я запускаю Программу и открываю соответствующую страницу без задержки в CodeBehind моей модели представления не завершается sh привязка данных.

Вот проблема c Код:

Код позади

public Tree_ListView()
        {
            var dispatcher =  Windows.UI.Core.CoreWindow.GetForCurrentThread().Dispatcher;
            this.InitializeComponent();
            ViewModel = new TreeListViewModel(new BasicItemService());
            DataContext = ViewModel;

            this.WhenActivated(disposer =>
                {
                    this.OneWayBind(ViewModel, viewmosel => viewmosel.BasicItemViewModels,
                        view => view.TreeView.ItemsSource).DisposeWith(disposer);

                    this.Bind(ViewModel, viewmodel => viewmodel.Searchterm,
                        view => view.AutoSuggestBox.Text);
                });
            //Thread.Sleep(802);
        }

ViewModel:

    public TreeListViewModel(BasicItemService basicItemService)
       {
                    _searchterm = string.Empty;
                    _service = basicItemService;
                    bool DefaultPredicate(Node<BasicItem, int> node) => node.IsRoot;

                    var filter = this.WhenValueChanged(x => x.Searchterm)
                        .Throttle(TimeSpan.FromMilliseconds(800))
                        .Do(s =>
                        {
                            Trace.WriteLine($"\r\nSearching for: '{s}' !");
                        })
                        .Select(BuildFilter);

                    _disposeTag = _service.Items.Connect()
                        .Filter(filter)
                        .Do(s =>
                        {
                            Trace.WriteLine($"\r\n Filter finished");
                        })
                        .TransformToTree(item => item.ParentId,
                            Observable.Return((Func<Node<BasicItem, int>, bool>)DefaultPredicate))
                         .Do(s =>
                        {
                            Trace.WriteLine($"\r\n Tree finished");
                        })
                        .Transform(node => new BasicItemViewModel(node))
                        .Do(s =>
                        {
                            Trace.WriteLine($"\r\n Transform finished");
                        })
                        .Bind(out _basicItemViewModels) // update observable collection bindings
                        .Do(s =>
                        {
                            Trace.WriteLine($"\r\n Bind finished");
                        })
                        .DisposeMany() // dispose when no longer required
                        .Do(s =>
                        {
                            Trace.WriteLine($"\r\n Dispose finished");
                        })
                        .Subscribe(x =>
                        {
                            Trace.WriteLine($"Got {_basicItemViewModels.Count} results");
                        });
        }

_disposetag - это IDisposable, а _basicItemViewModels - это ReadonlyObservableCollection . BasicItemViewModel инкапсулирует мою модель BasicItem, которая имеет два int-Properties Id & ParentId и имя строкового свойства.

Если я использую код, как указано выше, без Thread.Sleep, я получаю следующий вывод:

Searching for '' !
Filtering finished
Tree finished
Transformation finished

А в представлении отображается пустой список. Я также заметил следующие предупреждения. Если они происходят после вывода моей модели представления (происходит, если я использую Thread.Sleep или устанавливаю точку останова в CodeBehind), все загружается нормально:

POCOObservableForProperty: The class ReactiveTreeUWP.Tree_ListView property TreeView is a POCO type and won't send change notifications, WhenAny will only return a single value!
POCOObservableForProperty: The class ReactiveTreeUWP.Tree_ListView property AutoSuggestBox is a POCO type and won't send change notifications, WhenAny will only return a single value!

У кого-нибудь была подобная проблема? Я уже посмотрел несколько примеров для моей проблемы. Мой проект в основном является более простой версией проекта ниже, но с другим фильтром.

https://dynamic-data.org/2015/07/07/reactive-tree-using-dynamic-data/

Я также посмотрел dynamici c хранилище данных на GitHub и посмотрел там динамический c пример трейдера , но я не могу найти свою ошибку.

...