【发布时间】:2018-01-31 18:35:49
【问题描述】:
我正在使用带有 Prism 的 Xamarin.Forms。
给定一个具有街道、城市等属性的地点模型和一个允许用户定义两个地点(起始地点和目标地点)的路线视图,我想定义一个地点视图以包含在路线视图中以避免重复代码。
生成的 RouteView 可能是这样的
<label Text="Starting Place" />
<controls:PlaceView
Place="{Binding StartingPlace}" />
<label Text="Target Place" />
<controls:PlaceView
Place="{Binding TargetPlace}" />
Place 是 PlaceView 中的可绑定属性,StartingPlace 和 TargetPlace 是 Routes 视图模型中 Place 模型的实例。
我已经尝试通过
实现 PlaceView 中的绑定<Label Text="Street" />
<Entry Text="{Binding Place.Street}" />
但这不起作用。 UI 中的更改不会导致 Place 实例的更改。
那么,将 Place 的属性绑定到嵌套视图的最优雅的方式是什么?我想避免在每个实例化中明确命名它们。
我有两个想法,最终如何实现,但我不确定如何实现它们。
为 PlaceView 创建一个视图模型并在那里创建属性,例如将 Street 连接到 Place.Street。这可能吗?如果是,那么如何从视图模型内部访问给定的地方?
在 Place View 的代码中实现此连接。这里我不知道该怎么做。
已编辑:
为了明确,模型如下
class Place
{
private string _street;
public string Street
{
get => _street;
set => _street = value;
}
}
编辑 2
这个like是当前的视图模型(RouteViewViewModel)
public class RouteViewViewModel : BindableBase
{
private Place _startingPlace;
public Place StartingPlace
{
get => _startingPlace;
set => SetProperty(ref _startingPlace, value);
}
// TargetPlace is equivalent
}
解决方案
感谢@Sharada Gururaj,我得到了一个结果,即available on Github。
【问题讨论】:
-
你设置了SetPropertyChanged(nameof(StartingPlace));和 SetPropertyChanged(nameof(TargetPlace));在模型中?
-
@PavanVParekh 你是什么意思?模型(Place)不知道它使用的上下文,因此模型中既没有 TargetPlace 也没有 StartingPlace。它只是一个包含 Street 和 City 等属性的普通类(请参阅已编辑的问题)。
-
无论如何,您的(视图)模型都需要实现
INotifyPropertyChanged。如果您为未实现此接口的类的属性创建Bindings,您将无法更新 UI,并且(取决于 .NET Framework 版本)您可能会遇到内存泄漏。 -
好的,Model (Place) 是一个简单的 C# 类,与 ViewModel (RouteViewViewModel) 之间似乎有些混淆。 RouteViewViewModel 确实实现了 BindableBase 并具有 StartingPlace 和 TargetPlace 的属性。对于嵌套的 PlaceView,目前没有 ViewModel。我的问题是关于实施一个是否可行和有帮助。
标签: c# xaml xamarin.forms prism