C# 如何使用绑定嵌套视图?
我用的是Xamarin.带棱镜的表格 给定一个属性为Street、City等的地点模型和一个允许用户定义两个地点(起始地点和目标地点)的路线视图,我想定义一个地点视图以包含在路线视图中,以避免重复代码 由此产生的RouteView可能类似于C# 如何使用绑定嵌套视图?,c#,xaml,xamarin.forms,prism,C#,Xaml,Xamarin.forms,Prism,我用的是Xamarin.带棱镜的表格 给定一个属性为Street、City等的地点模型和一个允许用户定义两个地点(起始地点和目标地点)的路线视图,我想定义一个地点视图以包含在路线视图中,以避免重复代码 由此产生的RouteView可能类似于 <label Text="Starting Place" /> <controls:PlaceView Place="{Binding StartingPlace}" /> <label Text="Target Plac
<label Text="Starting Place" />
<controls:PlaceView
Place="{Binding StartingPlace}" />
<label Text="Target Place" />
<controls:PlaceView
Place="{Binding TargetPlace}" />
编辑2
这是当前视图模型(RouteViewModel)
解决方案
多亏了@Sharada Gururaj,我得到了一个结果,那就是
PlaceView
的视图模型会很有帮助,或者至少确保Place
实现属性更改通知,即INotifyPropertyChanged
源代码(并且,在PlaceView
XAML中添加命名引用):
是否已设置SetPropertyChanged(名称(起始位置));和SetPropertyChanged(名称(TargetPlace));在模型中?@PavanVParekh这是什么意思?模型(地点)不知道它所使用的上下文,因此模型中既没有TargetPlace也没有StartingPlace。它只是一个普通类,包含Street和City等属性(请参见编辑的问题)。您的(视图-)模型无论如何都需要实现INotifyPropertyChanged
。如果您为未实现此接口的类的属性创建绑定
,您将无法更新UI,并且(取决于.NET Framework版本)可能会出现内存泄漏。好的,看起来模型(Place)(一个简单的C#类)和视图模型(RouteViewModel)之间存在一些混淆。RouteViewModel确实实现了BindableBase,并且具有StartingPlace和TargetPlace的属性。对于嵌套的PlaceView,目前没有ViewModel。我的问题是实现一个视图模型是否可行且有用。因此,如果我为PlaceViewplaceViewModel:Bindable Base
创建一个视图模型,我如何访问ViewModels类中的绑定位置?例如,如何公共字符串Street{set=>\u place.Street=value;}
?我在哪里可以得到\u地点
,它必须是RouteView的绑定地点(即StartingPlace/TargetPlace),从视图模型内部?我完全确定我是否理解了您的问题-请在这里耐心听我说。如果您正在为PlaceView创建视图模型-那么您的公共场所开始地点
将成为公共场所视图模型开始地点
等等,用于RouteViewModel中的其他属性;您需要将模型转换为视图模型。例如:您可以在viewmodel的构造函数publicPlaceViewModel(Place-Place){this.Street=Place.Street;…}
中通过您的帮助完成此操作!非常感谢!对于其他所有卷入这个问题的人,我创建了一个
<Label Text="Street" />
<Entry Text="{Binding Place.Street}" />
class Place
{
private string _street;
public string Street
{
get => _street;
set => _street = value;
}
}
public class RouteViewViewModel : BindableBase
{
private Place _startingPlace;
public Place StartingPlace
{
get => _startingPlace;
set => SetProperty(ref _startingPlace, value);
}
// TargetPlace is equivalent
}
<ContentView x:Class="AppNamespace.PlaceView" x:Name="_parent">
<Label Text="Street" />
<Entry Text="{Binding Path=Place.Street, Source={x:Reference _parent}}" />
<!-- PlaceView usage -->
<controls:PlaceView BindingContext="{Binding StartingPlace}" />
<!-- Update binding in PlaceView control XAML -->
<Label Text="Street" />
<Entry Text="{Binding Path=Street}" />