【问题标题】:Set BindingContext to ViewModel in XAML on Xamarin.Forms在 Xamarin.Forms 上的 XAML 中将 BindingContext 设置为 ViewModel
【发布时间】: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,而不是类定义本身

标签: c# xaml mvvm xamarin.forms binding-context


【解决方案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 检索数据时它不起作用
猜你喜欢
  • 2016-12-08
  • 2020-06-29
  • 2015-02-09
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
相关资源
最近更新 更多