我在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的属性绑定到嵌套视图的最优雅方法是什么?我想避免在每个实例化中明确命名所有这些。
我有两个想法,最终如何实现,但我不确定如何实现它们。
为PlaceView创建一个视图模型,并在那里创建属性,例如将Street连接到Place.Street。这是可能的,如果是,那么如何从视图模型中访问给定的地方?
在Place View的代码中实现此连接。在这里,我不知道该怎么做。
编辑:
要清除,模型如下
<Label Text="Street" />
<Entry Text="{Binding Place.Street}" />
修改2
这就像当前的视图模型(RouteViewViewModel)
class Place
{
private string _street;
public string Street
{
get => _street;
set => _street = value;
}
}
感谢@Sharada Gururaj我得到的结果是available on Github。
答案 0 :(得分:0)
- 为PlaceView创建一个视图模型,并在那里创建属性,例如将Street连接到Place.Street。这是可能的,如果是,那么如何从视图模型中访问给定的地方?
醇>
答案是肯定的,为PlaceView
建立一个视图模型会很有帮助 - 或者至少确保Place
实现属性更改通知,即INotifyPropertyChanged
- 在地方视图的代码中实现此连接。在这里,我不知道该怎么做。
醇>
第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}" />