在 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 代码到代码隐藏

Xamarin.Forms 在 XAML 中使用局部变量

如何在 XAML [Xamarin.Forms] 中使用 String 以外的类型设置自定义属性值

如何用xamarin.forms xaml

Xamarin.Forms XAML的辅助功能Code Snippet