gpt4 book ai didi

.net - 响应式(Reactive)UI 9 : binding lists to a WPF view

转载 作者:行者123 更新时间:2023-12-04 01:18:22 24 4
gpt4 key购买 nike

在 ReactiveUI 9 中,ReactiveList已弃用,取而代之的是 DynamicData (Blog post)。我目前正在尝试更新我的代码以使用 SourceList .我能够让 ViewModel 工作,但似乎使用 SourceList作为 WPF 中的绑定(bind)数据源并不容易。

我的第一次尝试是像之前版本的 ReactiveUI 一样创建绑定(bind):

this.OneWayBind(ViewModel, vm => vm.MyList, v => v.MyListView.ItemsSource);

这不起作用,因为 SourceList不可枚举(无法将 DynamicData.ISourceList 转换为 System.Collections.IEnumerable)

我的第二次尝试是使用 Items列表的属性。
this.OneWayBind(ViewModel, vm => vm.MyList.Items, v => v.MyListView.ItemsSource);

这不起作用,因为 Items getter 在内部创建列表的副本,这意味着列表中的更改不会反射(reflect)在 View 中。

我的第三次尝试是使用 Bind创建 ReadOnlyObservableCollection 的方法.
我不想在 View 模型中执行此操作,因为那样我将不得不为每个 View 模型中的每个列表添加第二个列表属性,这会使我的代码困惑,违反 DRY 原则。此外,要绑定(bind)的列表类型取决于所使用的 View 框架。 (例如:WinForms 使用 BindingList 代替)

此外,我的 View 的 View 模型可能会更改,这意味着在设置新 View 模型时必须清理和替换生成的绑定(bind)和列表。这给了我以下片段:
this.WhenAnyValue(v => v.ViewModel.VisibleInputs)
.Select(l =>
{
var disposer = l.Connect().Bind(out var list).Subscribe();
return (List: list, Disposer: disposer);
})
.PairWithPreviousValue()
.Do(p => p.OldValue.Disposer?.Dispose()) // Cleanup the previous list binding
.Select(p => p.NewValue.List)
.BindTo(this, v => v.InputsList.ItemsSource);

这工作正常,但它非常冗长。我可以为此创建一个扩展方法,但也许有更好/内置的方法来使用 DynamicData 进行 WPF 列表绑定(bind)?

最佳答案

我认为这个想法是 View 绑定(bind)到 IObservableCollection<T>在调度程序线程上,SourceList<T>用流产生的对象来馈送这个对象,例如:

public class MainViewModel : ReactiveObject
{
private SourceList<int> _myList { get; } = new SourceList<int>();
private readonly IObservableCollection<int> _targetCollection = new ObservableCollectionExtended<int>();

public MainViewModel()
{
Task.Run(()=>
{
for (int i = 0; i < 100; ++i)
{
_myList.Add(i);
System.Threading.Thread.Sleep(500);
}
});
_myList.Connect()
.ObserveOnDispatcher()
.Bind(_targetCollection)
.Subscribe();
}

public IObservableCollection<int> TargetCollection => _targetCollection;
}

查看:
this.OneWayBind(ViewModel, vm => vm.TargetCollection, v => v.MyListView.ItemsSource);

你可以阅读更多关于这个 here .

关于.net - 响应式(Reactive)UI 9 : binding lists to a WPF view,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53708140/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com