2017-05-11 8 views
0

Ich bin neu in Xamarin und ich versuche, mein ViewModel an die Ansicht zu binden, aber ich konnte es noch nicht tun.Xamarin Forms Bindung wird nicht auf ListView angezeigt

Hier ist der Code.

(Modell)

namespace CadastroProdutos 
{ 
    public class Produto 
    { 
     public string Codigo { get; set; } 
     public string Identificacao { get; set; } 
     public string Tipo { get; set; } 
    } 
} 

(beobachtbare Modell)

namespace CadastroProdutos 
{ 
    public class ObservableProduto : INotifyPropertyChanged 
    { 
     Produto produto; 
     public ObservableProduto() 
     { 
      produto = new Produto() 
      { 
       Identificacao = "Primeiro", 
       Codigo = "123456" 

      }; 
      produto = new Produto() 
      { 
       Identificacao = "Segundo", 
       Codigo = "123456" 

      }; 
      produto = new Produto() 
      { 
       Identificacao = "Terceiro", 
       Codigo = "123456" 

      }; 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 

     public string Codigo 
     {    
      set 
      { 
       if (!value.Equals(produto.Codigo, StringComparison.Ordinal)) 
       { 
        produto.Codigo = value; 
        OnPropertyChanged("Codigo"); 
       } 
      } 
      get 
      { 
       return produto.Codigo; 
      } 
     } 

     public string Identificacao 
     { 
      set 
      { 
       if (!value.Equals(produto.Identificacao, StringComparison.Ordinal)) 
       { 
        produto.Identificacao = value; 
        OnPropertyChanged("Identificacao"); 
       } 
      } 
      get 
      { 
       return produto.Identificacao; 
      } 
     } 

     public string Tipo 
     { 
      set 
      { 
       if (!value.Equals(produto.Tipo, StringComparison.Ordinal)) 
       { 
        produto.Tipo = value; 
        OnPropertyChanged("Tipo"); 
       } 
      } 
      get 
      { 
       return produto.Tipo; 
      } 
     } 

     void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      var handler = PropertyChanged; 
      if (handler == null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 
    } 
} 

(Ansichtsmodell)

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; 
      } 
     } 
    } 
} 

(Ansicht)

<?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> 

Es hat nicht funktioniert, Es hat diese Elemente auf der Liste nicht angezeigt. Kann mir jemand helfen?

Vielen Dank im Voraus.

+0

Ihr ObservableProduto ist falsch und enthält nur 1 Produto (und nicht 3 wie in Ihrem Konstruktor geschrieben) ... Und Sie brauchen kein get/set für Ihre ObservableCollection, da es bereits in Ihrem Konstruktor erstellt wurde ... aber Es wird Ihr Problem sowieso nicht lösen ... – hugoterelle

Antwort

1

Sie verstehen den MVVM-Ansatz nicht ganz, aber Sie sind fast da. Sie müssen nicht die Klasse ObservableProduto haben. Sie können Ihre Produto Klasse zu Ihrem Modell machen.

Dies ist Ihr Produto Modell. Ich ging voran und änderte es für dich.

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)); 
    } 
} 

Sie sollten eine ObservableCollection Ihrer Produto s in einem Ansichtsmodell enthalten. Ich sehe, du hast das getan. Ich habe es ein bisschen bearbeitet. Sie müssen vorsichtig sein, wenn Sie Ihre ObservableCollection auf ein Set zurücksetzen.

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; 
      } 
     } 
    } 
} 

Hinweis: Sie müssen die Elemente Ihrer ObservableColleciton noch hinzuzufügen.

+0

Danke Sir! Nach diesen Änderungen ist ein Fehler aufgetreten "Das Objekt des Typs 'Xamarin.Forms.TextCell' kann nicht in den Typ 'Xamarin.Forms.View' konvertiert werden." – freitas

+0

Das liegt daran, dass Sie eine 'TextCell' in einem' StackLayout' gefunden haben. Entferne das 'StackLayout'. Sie brauchen nur die 'TextCell'. Alles, was ein 'ListView' anzeigt, muss irgendeine Form von Zelle sein oder von' ViewCell' erben und alles, was ein 'StackLayout' anzeigt, muss eine Form von' View' sein. –

Verwandte Themen