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