Listview Xamarin将视图模型与ViewCell一起使用会弄乱视图模型绑定

Listview Xamarin将视图模型与ViewCell一起使用会弄乱视图模型绑定,listview,xamarin,binding,viewmodel,datatemplate,Listview,Xamarin,Binding,Viewmodel,Datatemplate,当我为这篇文章写标题的时候,我已经看过了所有的建议,但是没有人能帮我解决我的问题。因为这是我在这里的第一个问题,如果我问错了,请原谅我,如果我需要回答,请告诉我 然而,我在Xamarin使用ListView工作。 listView是通过将ItemSource设置为包含扩展ViewCell类的我的类的列表来填充的,基本上如下所示 问题 我遇到的问题是将ViewModel用于MeasurePointView.xaml.cs类。当尝试访问MeasurePointViewModel中设置为Measure

当我为这篇文章写标题的时候,我已经看过了所有的建议,但是没有人能帮我解决我的问题。因为这是我在这里的第一个问题,如果我问错了,请原谅我,如果我需要回答,请告诉我

然而,我在Xamarin使用ListView工作。 listView是通过将ItemSource设置为包含扩展ViewCell类的我的类的列表来填充的,基本上如下所示

问题

我遇到的问题是将ViewModel用于MeasurePointView.xaml.cs类。当尝试访问MeasurePointViewModel中设置为MeasurePointView.xaml.cs的BindingContext的任何属性时,例如:
[0:]绑定:“Mobile.Pages.MeasurePointView”上未找到MeasurePointProps”属性,调试器的目标属性:“Xamarin.Forms.Label.Text”
,当然屏幕上不会显示任何内容

所以我的问题是:如何在ViewCell类“MeasurePointView”和ViewModel“MeasurePointViewModel”之间设置绑定以使其正常工作?

另外,请让我知道我对数据绑定的误解有多严重。只是我一直在让这种方法在应用程序中发挥作用,除了这里

我想澄清一下: 页面扩展基本页面(扩展内容页面) 而Viewmodels派生自BaseViewModel(基本上实现了INotifyPropertyChanged)

ListOneView.xaml.cs

using Mobile.Controls;
using Mobile.Pages;
using Mobile.ViewModels;
using System.Collections.ObjectModel;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Mobile.Views {
  [XamlCompilation(XamlCompilationOptions.Compile)]
  public partial class ListOneView : BasePage {

    public ListView ListView;

    public ObservableCollection<MeasurePoint> MeasurePointList { get; set; }

    public ListOneView(ObservableCollection<MeasurePoint> list) {
      MeasurePointList = list;
      InitializeComponent();
      InitializeBindings();
      InitializeMeasurePoints();
    }

    public void InitializeBindings() {
      BindingContext = ViewModel = new ListOneViewViewModel(MeasurePointList);
    }

    private void InitializeMeasurePoints() {
      ListView = MeasurePointListView;
      MeasurePointListView.ItemTemplate = new DataTemplate(typeof(MeasurePointView));
      MeasurePointListView.ItemsSource = (ViewModel as ListOneViewViewModel).MeasurePointViewList;
    }
}



using Mobile.Controls;
using Mobile.ViewModels;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Mobile.Pages {
  [XamlCompilation(XamlCompilationOptions.Compile)]
  public partial class MeasurePointView : ViewCell {
    public MeasurePoint MeasurePoint { get; set; }
    public MeasurePointView() {
      InitializeComponent();
      InitializeBindings();
    }

    private void InitializeBindings() {
      BindingContext = new MeasurePointViewViewModel() {
        MeasurePointProps = this.MeasurePoint
      };
    }
  }

  public class MeasurePointViewViewModel : BaseViewModel {
    public MeasurePoint MeasurePointProps { get; set; }
  }
}

MeasurePointView.xaml


<?xml version="1.0" encoding="UTF-8"?>
<ViewCell
    xmlns="http://xamarin.com/schemas/2014/forms" 
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:d="http://xamarin.com/schemas/2014/forms/design"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Class="Mobile.Pages.MeasurePointView"
    mc:Ignorable="d">
    <ViewCell.View>
        <ContentView>
            <Label Text="{Binding MeasurePointProps.Title}" />
        </ContentView>
    </ViewCell.View>
</ViewCell>


我想你把事情弄复杂了一点。将ListView与视图单元格一起使用非常简单。您可以创建ListView并定义自己的ItemTemplate,然后直接在其中使用ViewCell。您还可以创建自己的自定义视图单元并使用它

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="demoListView.ImageCellPage">
    <ContentPage.Content>
        <ListView  x:Name="listView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout BackgroundColor="#eee" Orientation="Vertical">
                            <StackLayout Orientation="Horizontal">
                                <Image Source="{Binding image}" />
                                <Label Text="{Binding title}" TextColor="#f35e20" />
                                <Label Text="{Binding subtitle}" HorizontalOptions="EndAndExpand" TextColor="#503026" />
                            </StackLayout>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ContentPage.Content>
</ContentPage>

有关如何将ListView与视图单元格一起使用的更多信息,请参阅以下链接


我想你把事情弄复杂了一点。将ListView与视图单元格一起使用非常简单。您可以创建ListView并定义自己的ItemTemplate,然后直接在其中使用ViewCell。您还可以创建自己的自定义视图单元并使用它

<?xml version="1.0" encoding="UTF-8"?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="demoListView.ImageCellPage">
    <ContentPage.Content>
        <ListView  x:Name="listView">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <StackLayout BackgroundColor="#eee" Orientation="Vertical">
                            <StackLayout Orientation="Horizontal">
                                <Image Source="{Binding image}" />
                                <Label Text="{Binding title}" TextColor="#f35e20" />
                                <Label Text="{Binding subtitle}" HorizontalOptions="EndAndExpand" TextColor="#503026" />
                            </StackLayout>
                        </StackLayout>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </ContentPage.Content>
</ContentPage>

有关如何将ListView与视图单元格一起使用的更多信息,请参阅以下链接

例如,我从调试器中获取[0:]绑定:“Mobile.Pages.MeasurePointView”的目标属性“Xamarin.Forms.Label.Text”上找不到“MeasurePointProps”属性,当然屏幕上不会显示任何内容

MeasurePoint.cs

public class MeasurePoint
{
    public string Title { get; set; }
    public string Point { get; set; }

}
MeasurePointViewModel.cs


using Mobile.Controls;
using Mobile.Pages;
using System.Collections.ObjectModel;

namespace Mobile.ViewModels {
  public class ListOneViewViewModel : BaseViewModel {

    public ObservableCollection<MeasurePointView> MeasurePointViewList { get; set; }

    public ListOneViewViewModel(ObservableCollection<MeasurePoint> measurePointList) {
      if (MeasurePointViewList == null)
        MeasurePointViewList = new ObservableCollection<MeasurePointView>();

      foreach (MeasurePoint mp in measurePointList) {
        MeasurePointViewList.Add(new MeasurePointView() {
          MeasurePoint = mp
        });
      }
    }
  }
}

public class MeasurePointViewViewModel : INotifyPropertyChanged
{
    public MeasurePointViewViewModel()
    {
        MeasurePointProps = new MeasurePoint() { Point = "B", Title = "2" };
    }

    private MeasurePoint _MeasurePointProps;
    public MeasurePoint MeasurePointProps
    {
        get { return _MeasurePointProps; }
        set
        {
            _MeasurePointProps = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
解决方案1:

如果要绑定MeasurePointProps.Title,可以直接使用MeasurePointViewModel设置BindingContent

Xaml:

解决方案2:

如果您想绑定标题,可以查看下面的代码

Xaml:

例如,我从调试器中获取[0:]绑定:“Mobile.Pages.MeasurePointView”的目标属性“Xamarin.Forms.Label.Text”上找不到“MeasurePointProps”属性,当然屏幕上不会显示任何内容

MeasurePoint.cs

public class MeasurePoint
{
    public string Title { get; set; }
    public string Point { get; set; }

}
MeasurePointViewModel.cs


using Mobile.Controls;
using Mobile.Pages;
using System.Collections.ObjectModel;

namespace Mobile.ViewModels {
  public class ListOneViewViewModel : BaseViewModel {

    public ObservableCollection<MeasurePointView> MeasurePointViewList { get; set; }

    public ListOneViewViewModel(ObservableCollection<MeasurePoint> measurePointList) {
      if (MeasurePointViewList == null)
        MeasurePointViewList = new ObservableCollection<MeasurePointView>();

      foreach (MeasurePoint mp in measurePointList) {
        MeasurePointViewList.Add(new MeasurePointView() {
          MeasurePoint = mp
        });
      }
    }
  }
}

public class MeasurePointViewViewModel : INotifyPropertyChanged
{
    public MeasurePointViewViewModel()
    {
        MeasurePointProps = new MeasurePoint() { Point = "B", Title = "2" };
    }

    private MeasurePoint _MeasurePointProps;
    public MeasurePoint MeasurePointProps
    {
        get { return _MeasurePointProps; }
        set
        {
            _MeasurePointProps = value;
            OnPropertyChanged();
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName]string propertyName = null)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
解决方案1:

如果要绑定MeasurePointProps.Title,可以直接使用MeasurePointViewModel设置BindingContent

Xaml:

解决方案2:

如果您想绑定标题,可以查看下面的代码

Xaml:


ListView中的每个项都将自动设置其BindingContext。你不需要自己做这个。好的,谢谢,但是我想把它设置为ViewModel,我在它自己的类中分配它。不仅仅是xaml.cs类,您无缘无故地为自己创建了大量额外的工作。如果您的
ItemsSource
是一个
列表
,则
列表视图
中的每个单元格都将具有相应
x
BindingContext
。我不清楚你想通过自己的方式完成什么。原因是要将一些逻辑从简单的“视觉逻辑”中分离出来,因为这是一长串列表和视觉逻辑的结尾。我只想将xaml.cs用于可视逻辑,而要绑定的viewmodel用于更面向数据的逻辑。它将用于验证输入并将其发送到API communications。ListView中的每个项都将自动设置其BindingContext。你不需要自己做这个。好的,谢谢,但是我想把它设置为ViewModel,我在它自己的类中分配它。不仅仅是xaml.cs类,您无缘无故地为自己创建了大量额外的工作。如果您的
ItemsSource
是一个
列表
,则
列表视图
中的每个单元格都将具有相应
x
BindingContext
。我不清楚你想通过自己的方式完成什么。原因是要将一些逻辑从简单的“视觉逻辑”中分离出来,因为这是一长串列表和视觉逻辑的结尾。我只想将xaml.cs用于可视逻辑,而要绑定的viewmodel用于更面向数据的逻辑。它将用于验证输入并将其发送到API communications。@Burritofreant:如果我的r
public MainPage()
    {
        InitializeComponent();
        InitializeBindings();
    }

    private void InitializeBindings()
    {
        //BindingContext = new MeasurePointViewViewModel();
        BindingContext = new MeasurePointViewViewModel().MeasurePointProps;
    }