gpt4 book ai didi

c# - 如何确保在构建 View 模型后发生数据绑定(bind)?

转载 作者:行者123 更新时间:2023-12-03 10:33:03 25 4
gpt4 key购买 nike

我在使用 MVVM 架构时遇到了一个重大问题,我没有看到它直接解决甚至提到过。在多线程应用程序中, View 可能会在 View 模型完全构建之前开始数据绑定(bind),从而导致绑定(bind)失败。

这是一个例子:

public class StocksViewModel
{

// blah blah

public IOrderedEnumerable<KeyValuePair<string, string>> AvailableStocks
{
get
{
// This could take a minute or two
return StockService.GetAvailableStocks(User);
}
}

public double Quantity
{
get => Quantity;
set
{
Quantity = value; RaisePropertyChanged(nameof(Quantity));
}
}

public double Symbol
{
get => Symbol;
set
{
Symbol = value; RaisePropertyChanged(nameof(Symbol));
}
}
}

这是 XAML:
        <ComboBox x:Name="Quantity"  Grid.ColumnSpan="2" Grid.Column="2" SelectedValue="{x:Bind Mode=TwoWay, Path=ViewModel.Quantity}"  DisplayMemberPath="Value" SelectedValuePath="Key" ItemsSource="{x:Bind ViewModel.AvailableStocks}"   />

<ComboBox x:Name="Symbol" Grid.ColumnSpan="2" Grid.Column="2" SelectedValue="{x:Bind Mode=TwoWay, Path=ViewModel.Symbol}" DisplayMemberPath="Value" SelectedValuePath="Key" ItemsSource="{x:Bind ViewModel.AvailableStocks}" />

如您所见,数据绑定(bind)可能是不可预测的。如果 StockService 需要几秒钟,则 Quantity 和 Symbol 将永远无法将数据绑定(bind)到 AvailableStock。

处理这种情况的规定方法是什么?

最佳答案

我的方法是采取与您在这里不同的道路。在我的 View 模型的构造函数中,我将创建一个 readonly ObservableCollection<KeyValuePair<string, string>> .我还将启动一个新线程来调用 GetAvailableStocks那时候。当结果返回时,您可以填充 ObservableCollection .但是,在检索数据时,我会包含一个加载图标或类似的想法,以便用户知道我们仍在收集结果。

View 模型应该加载它可以加载的所有数据,并准备好在收到数据时显示其他数据。如果可以将数据预加载并传递到 View 模型中,那就更好了,但这并不总是会发生。

代码示例(请原谅我在移动设备上的格式):

public class ViewModel
{
readonly ObservableCollection<KeyValuePair<string, string>> _availableStocks;

public ObservableCollection<KeyValuePair<string, string>> AvailableStocks
{
get => _availableStocks;
}
public bool IsExecuting { get; set; }

public ViewModel()
{
_availableStocks = new ObservableCollection<KeyValuePair<string, string>>();
IsExecuting = true;
TaskFactory.StartNew(() =>
{
var results = StockService.GetAvailableStocks(User);
foreach (var stock in results)
AvailableStocks.Add(stock);
IsExecuting = false;
}
}
}

此代码未经测试,但我希望它能帮助您解决问题!

关于c# - 如何确保在构建 View 模型后发生数据绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47785406/

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