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)
while
newstringelement().Bind(这个“值名”)在指定时间执行