【发布时间】:2021-04-10 01:40:22
【问题描述】:
我的内容页面绑定到一个视图模型,但现在我需要将一些组件绑定到不同的视图模型。我的问题是,因为我已将页面的 BindingContext 绑定到视图模型,所以当我尝试将元素绑定到第二个视图模型时,{Binding propertyname} 语句会在视图模型中查找绑定到绑定上下文。
所以我的问题是:当 bindingcontext 设置为不同的视图模型时,如何简单地将元素绑定到视图模型而不是 bindingcontext?
我尝试过的东西不起作用
- 定义了第二个视图模型。并尝试通过静态资源进行绑定
代码
<ContentPage.Resources>
<ResourceDictionary>
<selectedDeal:DealsMViewModel x:Name="SelectedDeal" x:Key="SelectedDeal"/>
</ResourceDictionary>
</ContentPage.Resources>
代码
<Image
x:Name="CompanyImage"
HeightRequest="200"
Aspect="AspectFill"
Source="{Binding Source={StaticResource SelectedDeal}, Path=DealImage}" />
- 我已将图像元素放入堆栈布局,设置 StackLayout 的 BindingContext 和 尝试像这样绑定:
代码
<Image
x:Name="CompanyImage"
HeightRequest="200"
Aspect="AspectFill"
Source="{Binding DealImage}"/>
我有两种方法使绑定工作:
- 将第二个视图模型定义为绑定到 BindingContext 的第一个视图模型的属性,然后像这样实现图像
代码
<Image
x:Name="CompanyImage"
HeightRequest="200"
Aspect="AspectFill"
Source="{Binding secondViewModel.DealImage}"/>
- 在后面的代码中以编程方式设置图像源。
代码
CompanyImage.Source = selectedDeal.DealImage;
但我真正想要实现的是尽可能在 XAML 部分中学习执行此操作的方法!非常感谢任何帮助!
【问题讨论】:
-
如果你有一个特定的页面显示,有它自己的视图模型,那你为什么不把 DealImage 属性放在里面呢?理想情况下,每个页面应该只知道自己的视图模型,而不是假设堆栈上还有其他页面打开。我看到的最佳方式是您页面的视图模型将第二个视图模型作为其子视图。
-
最好创建一个自定义控件(具有自己的视图模型),然后通过 xaml 访问它,如
<SelectedDeal DealImage={Binding SomeSource}/>并将来自 DealsMViewModel 的逻辑放入 SelectedDeal 控件中?另一个想法是,如果您尝试访问的视图模型是嵌套的,请使用 Binding Source={RelativeSource AncestorType={x:Type ...}}。
标签: c# xamarin xamarin.forms