2017-08-18 4 views
1

Sagen, ich habe ein Nur-Lese-Modell ...Xamarin MVVM Benutzerdefinierte Modelleigenschaften?

[DataContract] 
public partial class Person { 
    [DataMember] 
    public virtual string LastName { get; set; } 

    [DataMember] 
    public virtual string FirstName { get; set; } 
} 

A View ...

<?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="TheApp.APage" 
    BackgroundColor="#03264A" 
    Padding="0,0,0,0"> 
    <ContentPage.Content> 
     <StackLayout 
      BackgroundColor="Transparent"> 
      <ListView 
       ItemsSource="{Binding PersonSearchCollection}"> 
       <ListView.ItemTemplate> 
        <DataTemplate> 
         <ViewCell> 
          <Label 
           Text="{Binding FirstName}" /> 
         </ViewCell> 
        </DataTemplate> 
       </ListView.ItemTemplate> 
      </ListView> 
     </StackLayout> 
    </ContentPage.Content> 
</ContentPage> 

Und ein Ansichtsmodell (Grundidee)

namespace TheApp.ViewModels { 
    public class APagePageViewModel : Helpers.BindableBase { 

     private ObservableCollection<Person> _PersonSearchCollection = new RangeObservableCollection<Person>(); 

     public ObservableCollection<Person> PersonSearchCollection { 
      get { return _PersonSearchCollection; } 
      set { SetProperty(ref _PersonSearchCollection, value); } 
     } 
    } 
} 

Mein Listview eine gebunden ist ObservableCollection des Typs: Person. Dies wird von einem ServiceStack-Aufruf ausgefüllt, wenn der Benutzer einen Namen für die Suche eingibt.

Derzeit ist das Label im DataTemplate an FirstName gebunden, aber ich möchte, dass es eine neue Eigenschaft ist: FullName (Person.FirstName + "" + Person.LastName).

Wie würde ich die Eigenschaft zum Modell hinzufügen, die ich nicht bearbeiten kann? Benötige ich eine separate VM für das Modell selbst und ändere stattdessen die ObservableCollection von diesem Typ? Jedes Beispiel wäre großartig!

Sorry, wenn dies eine grundlegende Frage ist, bin ich ziemlich neu zu Xamarin.

Vielen Dank!

+0

Änderung Ihrer Datenvorlage Ramankingdom

Antwort

1

Ihre Sichtzelle

ändern
<ViewCell> 
<StackLayout Orientation="Horizontal"> 
    <Label Text="{Binding FirstName}" 
    <Label Text=" " 
    <Label Text="{Binding LastName}" 
</StackLayout> 
</ViewCell> 

Andere Art und Weise

  1. Ein benutzerdefiniertes Objekt definieren

    public class CustomPerson 
        { 
         public CustomPerson(Person P) 
         { 
          FirstName = P.FirstName; 
          LastName = P.LastName; 
         } 
         public string FirstName { get; set; } 
         public string LastName { get; set; } 
         public string FullName 
         { 
          get { return string.Format("{0} {1}", FirstName, LastName);} 
         } 
    
        } 
    

(2) Definieren Sie eine Sammlung mit Getter

public IEnumerable<CustomPerson> CustomCollection 
{ 
    get { return _personSearchCollection.Select(p => new CustomPerson(p)); } 
} 

Wenn Sie aktualisieren Person suchen Sammlung Eigenschaftsänderung für kundenspezifische Sammlung erhöhen.

  1. schließlich mit Custom Bindung
+0

Vielen Dank für die Antwort. Ich kann sehen, wie das funktionieren würde, aber es scheint nicht der beste Weg zu sein, es zu tun? Ich habe das Gefühl, ein Label nur für Leerzeichen, Charaktere usw. zu erstellen, ist übertrieben? Zum Beispiel, wenn ich machen wollte: John Smith (19) würde ich 7 Etiketten benötigen? 3 für Vorname/Nachname/Alter und 4 für 2 Leerzeichen und 2 Klammern. – ksumarine

+0

Ich bin neu in Xamarin, aber ich kann es in WPF XAML Single Line arbeiten. Ich weiß nicht, ob es in Xamarin Läufe gibt – Ramankingdom

+0

hier ist der Schlüssel. Ich weiß nicht, wie Sie es verwenden https: //developer.xamarin.com/guides/xamarin-forms/benutzerschnittstelle/text/label/# Formatted_Text – Ramankingdom