C# 如何使用绑定嵌套视图?

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

我用的是Xamarin.带棱镜的表格

给定一个属性为Street、City等的地点模型和一个允许用户定义两个地点(起始地点和目标地点)的路线视图,我想定义一个地点视图以包含在路线视图中,以避免重复代码

由此产生的RouteView可能类似于

<label Text="Starting Place" />
<controls:PlaceView
   Place="{Binding StartingPlace}" />
<label Text="Target Place" />
<controls:PlaceView
   Place="{Binding TargetPlace}" />
编辑2

这是当前视图模型(RouteViewModel)

解决方案 多亏了@Sharada Gururaj,我得到了一个结果,那就是

  • 为PlaceView创建视图模型,并在其中创建属性,以连接例如Street到Place.Street。这是否可能?如果可能,那么如何从视图模型内部访问给定位置
  • 答案是肯定的,拥有
    PlaceView
    的视图模型会很有帮助,或者至少确保
    Place
    实现属性更改通知,即
    INotifyPropertyChanged

  • 在Place视图的代码中实现此连接。在这里,我不知道如何做到这一点
  • 完成第1点后-只需更改绑定即可将父控件用作
    源代码(并且,在
    PlaceView
    XAML中添加命名引用):


    是否已设置SetPropertyChanged(名称(起始位置));和SetPropertyChanged(名称(TargetPlace));在模型中?@PavanVParekh这是什么意思?模型(地点)不知道它所使用的上下文,因此模型中既没有TargetPlace也没有StartingPlace。它只是一个普通类,包含Street和City等属性(请参见编辑的问题)。您的(视图-)模型无论如何都需要实现
    INotifyPropertyChanged
    。如果您为未实现此接口的类的属性创建
    绑定
    ,您将无法更新UI,并且(取决于.NET Framework版本)可能会出现内存泄漏。好的,看起来模型(Place)(一个简单的C#类)和视图模型(RouteViewModel)之间存在一些混淆。RouteViewModel确实实现了BindableBase,并且具有StartingPlace和TargetPlace的属性。对于嵌套的PlaceView,目前没有ViewModel。我的问题是实现一个视图模型是否可行且有用。因此,如果我为PlaceView
    placeViewModel: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}" />