如何使用绑定嵌套视图?

时间:2017-08-23 09:01:20

标签: c# xaml xamarin.forms prism

我在Prism中使用Xamarin.Forms。

给定一个具有属性作为街道,城市等的地方模型以及允许用户定义两个地点,即起始地点和目标地点的路线视图,我想定义一个地方视图以包含在路线视图中以避免重复代码。

生成的RouteView可能类似于

dependencies 
{
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.0', 
    {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    androidTestCompile ('com.android.support.test.espresso:espresso-contrib:2.2.2')
    {
    exclude module: 'support-annotations'
    exclude module: 'support-v4'
    exclude module: 'support-v13'
    exclude module: 'recyclerview-v7'
    exclude module: 'appcompat-v7'
   })
    compile 'com.android.support:appcompat-v7:25.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.0-alpha7'
    testCompile 'junit:junit:4.12'
}

Place Place是PlaceView中的可绑定属性,StartingPlace和TargetPlace是路径视图模型中Place Place模型的实例。

我尝试通过

在PlaceView中实现Bindings
<label Text="Starting Place" />
<controls:PlaceView
   Place="{Binding StartingPlace}" />
<label Text="Target Place" />
<controls:PlaceView
   Place="{Binding TargetPlace}" />

但这不起作用。 UI中的更改不会导致Place实例发生更改。

那么将Place的属性绑定到嵌套视图的最优雅方法是什么?我想避免在每个实例化中明确命名所有这些。

我有两个想法,最终如何实现,但我不确定如何实现它们。

  1. 为PlaceView创建一个视图模型,并在那里创建属性,例如将Street连接到Place.Street。这是可能的,如果是,那么如何从视图模型中访问给定的地方?

  2. 在Place View的代码中实现此连接。在这里,我不知道该怎么做。

  3. 编辑:

    要清除,模型如下

    <Label Text="Street" />
    <Entry Text="{Binding Place.Street}" />
    

    修改2

    这就像当前的视图模型(RouteViewViewModel)

    class Place
    {
        private string _street;
        public string Street
        {
            get => _street;
            set => _street = value;
        }
    }
    

    Current Relationships

    解决方案

    感谢@Sharada Gururaj我得到的结果是available on Github

1 个答案:

答案 0 :(得分:0)

  
      
  1. 为PlaceView创建一个视图模型,并在那里创建属性,例如将Street连接到Place.Street。这是可能的,如果是,那么如何从视图模型中访问给定的地方?
  2.   

答案是肯定的,为PlaceView建立一个视图模型会很有帮助 - 或者至少确保Place实现属性更改通知,即INotifyPropertyChanged

  
      
  1. 在地方视图的代码中实现此连接。在这里,我不知道该怎么做。
  2.   

第1点完成后 - 只需更改绑定即可将父控件用作Source(并在PlaceView XAML中添加命名引用):

<ContentView x:Class="AppNamespace.PlaceView" x:Name="_parent">
        <Label Text="Street" />
        <Entry Text="{Binding Path=Place.Street, Source={x:Reference _parent}}" />

或使用BindingContext

<!-- PlaceView usage --> 
<controls:PlaceView BindingContext="{Binding StartingPlace}" />

<!-- Update binding in PlaceView control XAML -->
<Label Text="Street" />
<Entry Text="{Binding Path=Street}" />