В настоящее время я пытаюсь отобразить дерево с помощью библиотеки данных 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 пример трейдера , но я не могу найти свою ошибку.