我尝试在我的 xamarin ios mvvm 应用程序中创建一个图表,它适用于硬编码数据。当我尝试从我的 api 设置数据时,它崩溃了,因为我的 View 在我的数据加载之前加载,所以它返回 null
.
我确实绑定(bind)了它。
错误:Value cannot be null.
查看(在 viewdidload 中):
MvxFluentBindingDescriptionSet<UserCoinsTableView, UserCoinViewModel> set = new MvxFluentBindingDescriptionSet<UserCoinsTableView, UserCoinViewModel>(this);
var control = new MvxUIRefreshControl();
TableView.AddSubview(control);
var entries = new[]
{
new Entry(1)
{
},
new Entry(1)
{
}
};
//var chart = new LineChart() { Entries = entries };
var chart = new LineChart() { Entries = (this.ViewModel as UserCoinViewModel).Entries };
var chartView = new ChartView
{
Frame = new CGRect(0, 32, this.View.Bounds.Width, 160),
AutoresizingMask = UIViewAutoresizing.FlexibleWidth,
Chart = chart
};
this.headerView.AddSubview(chartView);
set.Bind(chart.Entries).To(vm => vm.Entries);
set.Apply();
View 模型:
public async void LoadData()
{
var entries = _CoinHistory.Select(x => new Entry(float.Parse(x.price_btc))).ToArray();
_entries = entries;
Entries = _entries;
}
数据 Prop :
private IEnumerable<Entry> _entries;
public IEnumerable<Entry> Entries
{
get
{
return _entries;
}
set
{
_entries = value;
RaisePropertyChanged(() => Entries);
}
}
最佳答案
您的绑定(bind)表达式是错误的。您没有指定绑定(bind)的目标。由于 MvvmCross 没有针对此图 TableView 的任何内置目标绑定(bind)声明,因此它不知道目标是什么。我写了一篇关于这个问题的博客文章,你可以在这里找到:https://blog.ostebaronen.dk/2018/01/mvvmcross-binding-target.html
但这里的问题是:
set.Bind(chart.Entries)
绑定(bind)应该有
View
您试图绑定(bind)的不是目标。而是 Entries
应使用 For()
指定链法:set.Bind(chart).For(c => c.Entries)
现在您已经指定了目标。然后你可以使用
To()
指定绑定(bind)的来源。set.Bind(chart).For(c => c.Entries).To(vm => vm.Entries);
这仅适用于您的图表组件的
Entries
property 是具有公共(public) getter 和 setter 的公共(public)属性。
关于xamarin - MicroSchart 不允许 mvvm 绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50195398/