在 Xamarin.Forms 上的 XAML 中将 BindingContext 设置为 ViewModel
Posted
技术标签:
【中文标题】在 Xamarin.Forms 上的 XAML 中将 BindingContext 设置为 ViewModel【英文标题】:Set BindingContext to ViewModel in XAML on Xamarin.Forms 【发布时间】:2016-11-27 20:49:46 【问题描述】:我想用 Xamarin.Form 和 MVVM 开发一个简单的项目。在我的解决方案(名为 XamarinPOC)中(除了标准 Xamarin.Forms 项目)我有一个单独的模型项目(XamarinPOC.Model)和一个单独的 ViewModel 项目(XamarinPOC.ViewModel)。
我在 XamarinPOC.ViewModel 项目中为 BaseViewModel 类(实现 INotifyPropertyChanged 接口)定义了一个抽象类,然后我创建了一个使用简单属性扩展 BaseViewModel 类的 SummaryViewModel 类:
namespace XamarinPOC.ViewModel
public class SummaryViewModel : BaseViewModel
private string _test = "The binding is OK!";
public String test
get
return _test;
set
_test = value;
OnPropertyChanged("test");
public SummaryViewModel()
接下来,我在 XamarinPOC 项目中创建了一个简单的 ContentPage (SummtyView),其中仅包含一个标签,我希望显示在 ViewModel 中定义的文本。我想使用 XAML 来定义视图和绑定,但是当我运行应用程序时没有显示任何内容,我在编译时和运行时没有错误,但不显示文本。我的 XAML 是这样的
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:XamarinPOC.ViewModel,assembly=XamarinPOC.ViewModel"
x:Class="XamarinPOC.Summary"
Title="Summary List"
BindingContext="XamarinPOC.ViewModel.SummaryViewModel">
<StackLayout>
<Label Text="Binding test"/>
</StackLayout>
</ContentPage>
最后我的 app.cs 是:
namespace XamarinPOC
public class App : Application
public App()
MainPage = new Summary();
在 XamarinPOC 项目中,我添加了对 XamarinPOC.ViewModel 和 XamarinPOC.Model 程序集的引用。
我认为问题出在绑定的 XAML 定义中,但我没有发现错误。我哪里错了?
【问题讨论】:
您需要为 BindingContext 分配 ViewModel 的 instance,而不是类定义本身 【参考方案1】:在您的情况下,要将视图绑定到 Xaml 中的视图模型,请这样做
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:viewModels="clr-namespace:XamarinPOC.ViewModel; assembly=XamarinPOC.ViewModel"
x:Class="XamarinPOC.Summary"
Title="Summary List">
<ContentPage.BindingContext>
<viewModels:SummaryViewModel/>
</ContentPage.BindingContext>
<StackLayout>
<Label Text="Binding test"/>
</StackLayout>
</ContentPage>
我注意到的一个旁注是命名约定,最好将所有 ViewModel,即使它只有一个 viewModel,放在名为“ViewModels”的文件夹中,所以你的命名空间案例将是 XamarinPOC.ViewModels
【讨论】:
感谢您的回答,我尝试了您的解决方案,但该应用程序在尝试解析命名空间xmlns:local="clr-namespace:XamarinPOC.ViewModel; assembly=XamarinPOC.ViewModel"
时引发了运行时异常,但您的解决方案朝着正确的方向发展,经过其他搜索我发现正确实施的信息:xmlns:mvvm="clr-namespace:XamarinPOC.ViewModel;assembly=XamarinPOC.ViewModel"
与您的解决方案的唯一区别在于 xmlns 前缀,因为在这种情况下使用 xmlns:local 是错误的,我需要使用另一个前缀(我选择 xmlns:mvvm)
太棒了!刚刚修好了
您无法在 ContentPage 上绑定 IsBusy,因为尚未设置视图模型。让我哭泣。
我认为可以,就像绑定标题一样。问题是为什么要从页面级别绑定它?
@BraveHeart 我也面临同样的问题。当我 assIGN 将值硬编码到视图的绑定时,但在从 api 检索数据时它不起作用以上是关于在 Xamarin.Forms 上的 XAML 中将 BindingContext 设置为 ViewModel的主要内容,如果未能解决你的问题,请参考以下文章
单击按钮上的 Xamarin.Forms 动画(Flash 背景)
Xamarin Forms - TabbedPage 平台特定的 xaml 代码到代码隐藏