C# Xamarin表单绑定未显示在ListView上
我是Xamarin的新手,我正在尝试将我的ViewModel绑定到视图,但我还不能这样做 这是密码 (模型) (可观测模型) (视图模型)C# Xamarin表单绑定未显示在ListView上,c#,xaml,listview,xamarin.forms,C#,Xaml,Listview,Xamarin.forms,我是Xamarin的新手,我正在尝试将我的ViewModel绑定到视图,但我还不能这样做 这是密码 (模型) (可观测模型) (视图模型) 名称空间CadastroProdutos { 公共类ListProdutViewModel { 可观测采集产品; 公共列表ProdutoViewModel() { produtos=新的ObservableCollection(); } 公共可观测采集产品 { 设置 { 如果(值!=produtos) { 产品=价值; } } 得到 { 返回产品; } }
名称空间CadastroProdutos
{
公共类ListProdutViewModel
{
可观测采集产品;
公共列表ProdutoViewModel()
{
produtos=新的ObservableCollection();
}
公共可观测采集产品
{
设置
{
如果(值!=produtos)
{
产品=价值;
}
}
得到
{
返回产品;
}
}
}
}
(视图)
它不起作用,它没有在列表中显示这些元素。有人能帮我吗
提前感谢。您还不太了解MVVM方法,但已经基本了解了。您不需要使用
observateProduto
类。您可以将您的Produto
分类为您的模型
这是您的Produto
型号。我为你把它改了
namespace CadastroProdutos
{
public class Produto : INotifyPropertyChanged
{
private string codigo;
public string Codigo
{
get {return codigo;}
set {codigo=value; OnPropertyChanged(); }
}
private string identificacao;
public string Identificacao
{
get {return identificacao;}
set {identificacao=value; OnPropertyChanged(); }
}
private string tipo ;
public string Tipo
{
get {return tipo;}
set {tipo=value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName]string propertyName = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
您应该在viewmodel中包含产品的ObservableCollection
。我看你已经做到了。我已经编辑了一点。您可能需要小心在集合上完全重置您的observateCollection
namespace CadastroProdutos
{
public class ListProdutoViewModel
{
ObservableCollection<Produto> produtos;
public ListProdutoViewModel()
{
produtos = new ObservableCollection<Produto>();
}
public ObservableCollection<Produto> Produtos
{
set
{
if (value != produtos)
{
produtos = value;
}
}
get
{
return produtos;
}
}
}
}
名称空间CadastroProdutos
{
公共类ListProdutViewModel
{
可观测采集产品;
公共列表ProdutoViewModel()
{
produtos=新的ObservableCollection();
}
公共可观测采集产品
{
设置
{
如果(值!=produtos)
{
产品=价值;
}
}
得到
{
返回产品;
}
}
}
}
注意:您需要将项目添加到您的ObservableCollectionon
中。您的ObservableProduto错误,仅包含1个Produto(而不是构造函数中编写的3个)。。。您不需要为ObservableCollection创建get/set,因为它已经在构造函数中创建了。。。但这无论如何也解决不了你的问题…谢谢你,先生!更改后出现错误“类型为'Xamarin.Forms.TextCell'的对象无法转换为类型为'Xamarin.Forms.View'”,这是因为TextCell
位于StackLayout
中。移除堆栈布局
。您只需要TextCell
。ListView
显示的所有内容都需要是某种形式的单元格或继承自ViewCell
,而StackLayout
显示的所有内容都需要是某种形式的视图。
namespace CadastroProdutos
{
public class ListProdutoViewModel
{
ObservableCollection<ObservableProduto> produtos;
public ListProdutoViewModel()
{
produtos = new ObservableCollection<ObservableProduto>();
}
public ObservableCollection<ObservableProduto> Produtos
{
set
{
if (value != produtos)
{
produtos = value;
}
}
get
{
return produtos;
}
}
}
}
<?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:CadastroProdutos;"
x:Class="CadastroProdutos.ListProduto"
Title="Listagem de Produtos">
<ContentPage.Content>
<ListView x:Name="listView" Margin="20,40,20,20" ItemsSource="{Binding Produtos}">
<ListView.BindingContext>
<local:ListProdutoViewModel />
</ListView.BindingContext>
<ListView.Header>
<StackLayout Orientation="Vertical" >
<Label Text="Produtos" HorizontalOptions="Center"/>
</StackLayout>
</ListView.Header>
<ListView.ItemTemplate>
<DataTemplate>
<StackLayout Orientation="Horizontal" >
<TextCell Text="{Binding Identificacao}"/>
</StackLayout>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</ContentPage.Content>
</ContentPage>
namespace CadastroProdutos
{
public class Produto : INotifyPropertyChanged
{
private string codigo;
public string Codigo
{
get {return codigo;}
set {codigo=value; OnPropertyChanged(); }
}
private string identificacao;
public string Identificacao
{
get {return identificacao;}
set {identificacao=value; OnPropertyChanged(); }
}
private string tipo ;
public string Tipo
{
get {return tipo;}
set {tipo=value; OnPropertyChanged(); }
}
public event PropertyChangedEventHandler PropertyChanged;
void OnPropertyChanged([CallerMemberName]string propertyName = "") =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
namespace CadastroProdutos
{
public class ListProdutoViewModel
{
ObservableCollection<Produto> produtos;
public ListProdutoViewModel()
{
produtos = new ObservableCollection<Produto>();
}
public ObservableCollection<Produto> Produtos
{
set
{
if (value != produtos)
{
produtos = value;
}
}
get
{
return produtos;
}
}
}
}