Xamarin.ios 在MvxCollectionViewCell中的嵌套MvxDialogViewController中获取BindingTarget
我有一个名为Xamarin.ios 在MvxCollectionViewCell中的嵌套MvxDialogViewController中获取BindingTarget,xamarin.ios,mvvmcross,Xamarin.ios,Mvvmcross,我有一个名为LocationsViewModel的ViewModel,其中有一个observedcollection。此外,我还有一个LocationsView,它是一个MvxCollectionViewController,我在其中创建一个绑定集,并将MvxCollectionViewSource绑定到ObservableCollection 在LocationCell中,这是一个MvxCollectionViewCell,我想显示一个MonoTouch.Dialog,该对话框绑定到当前 所选
LocationsViewModel
的ViewModel
,其中有一个observedcollection
。此外,我还有一个LocationsView
,它是一个MvxCollectionViewController
,我在其中创建一个绑定集,并将MvxCollectionViewSource
绑定到ObservableCollection
在LocationCell
中,这是一个MvxCollectionViewCell
,我想显示一个MonoTouch.Dialog
,该对话框绑定到当前
所选LocationViewModel
。最简单的方法似乎是在MvxCollectionViewCell
中创建嵌套的MvxDialogViewController
,但是要绑定
元素
在MvxDialogViewController
中,我显然需要创建一个绑定目标。我的问题是,我真的可以将绑定目标从MvxCollectionViewCell
传递到MvxDialogViewController
让我也试着用一些代码简单地解释一下,以提高理解
LocationsViewModel.cs
公共类位置viewmodel:MvxViewModel
{
...
公众可观察的收集地点
{
获取{return\u locationDataService.Locations.Locations;}
}
...
}
LocationViewModel.cs
公共类LocationViewModel:MvxNotifyPropertyChanged
{
...
//数以吨计的公共财产,如:
公共字符串名
{
获取{return LinkedDataModel.Name;}
设置
{
LinkedDataModel.Name=值;
RaisePropertyChanged(()=>名称);
}
}
公共双电流噪声级
{
获取{return LinkedDataModel.CurrentNoiseLevel;}
设置
{
LinkedDataModel.CurrentNoiseLevel=值;
RaisePropertyChanged(()=>CurrentNoiseLevel);
}
}
...
}
LocationsView.cs
[注册(“位置视图”)]
公共类位置视图
:MvxCollectionViewController
{
静态只读NSString LocationCellId=新NSString(“LocationCell”);
私有只读存储器已初始化;
公共场所视图()
:base(新UICollectionViewFlowLayout()
{
最小材料间距=0f,
ScrollDirection=UICollectionViewScrollDirection.Horizontal,
最小线间距=0f
})
{
_isInitialized=true;
ViewDidLoad();
}
公共新位置视图模型视图模型
{
获取{return(LocationsViewModel)base.ViewModel;}
设置{base.ViewModel=value;}
}
公共密封覆盖无效ViewDidLoad()
{
如果(!\u已初始化)
返回;
base.ViewDidLoad();
RegisterClassForCell(typeof(LocationCell),LocationCellId);
var source=新的MvxCollectionViewSource(CollectionView,LocationCellId);
CollectionView.Source=Source;
CollectionView.PaginEnabled=true;
var set=this.CreateBindingSet();
set.Bind(source.To)(vm=>vm.Locations);
set.Apply();
CollectionView.ReloadData();
}
}
LocationCell.cs
公共类LocationCell:MvxCollectionViewCell
{
[导出(“initWithFrame:”)]
公共定位单元(矩形框架)
:base(string.Empty,frame)
{
InitView();
}
公共定位单元(IntPtr手柄)
:base(string.Empty,句柄)
{
InitView();
}
私有void InitView()
{
var cell=新位置cellDialog();
添加(cell.View);
}
公共类LocationCellDialog
:MvxDialogViewController
{
公共位置CellDialog()
:base(UITableViewStyle.Grouped,null,true)
{ }
公共覆盖无效ViewDidLoad()
{
base.ViewDidLoad();
//我怎样才能在这里找到目标?
var目标=??;
Root=新的RootElement
{
新章节
{
new StringElement().Bind(目标,t=>t.Name),
new StringElement().Bind(目标,t=>t.CurrentNoiseLevel)
}.Bind(目标,t=>t.Name),
};
}
}
}
因此,问题是,我可以简单地将绑定目标从父LocationCell传递到嵌套LocationCellDialog,还是这是一个不允许的任务?MvvmCross中的每个
可绑定视图都有自己的数据上下文
对于顶级视图
而言,此数据上下文
是视图模型
对于列表
、表
或集合
中的单元格
,则将数据上下文
设置为列表中当前显示的单元格
的对象
如果要将单元格中的任何属性
数据绑定到DataContext
上的属性路径,则可以使用流畅的绑定语法
例如,要将名为myLabel
的子UILabel
的文本
值绑定到列表中人员
的子属性名称
,可以使用:
this.CreateBinding(myLabel).For(label => label.Text).To<Person>(p => p.Name).Apply();
this.CreateBinding(myLabel).For(label => label.Text).Apply();
在您的LocationCell
中,我想您是说您希望将嵌套的LocationCellDialog
的DataContext
绑定到包含单元格的DataContext
为此,您应该能够使用:
private void InitView()
{
var cell = new LocationCellDialog();
ContentView.Add(cell.View);
this.CreateBinding(cell).For(cell => cell.DataContext).Apply();
}
谢谢,很快就会看到:)好的,我想它现在可以工作了,但是使用var target=this.CreateInlineBindingTarget()
在MvxDialogViewController
中绑定元素时不起作用,比如:new StringElement().Bind(target,t=>t.Name)
whilenewstringelement().Bind(这个“值名”)代码>在指定时间执行