2016-12-13 2 views
0

Ich habe eine List<> Objekt Objekte, die als ItemsSource zu einem ListView verwendet werden. Auf meiner ListView ItemSelected Ereignis versuche ich, eines der Elemente dieses bestimmten Elements zu ändern. Die ursprünglichen Werte sind vom Objekt gebunden.Ändern eines ViewCell-Elements auf Klick

Bitte beachten Sie das folgende Beispiel:

itemClass.cs

class itemClass 
{ 
    public itemClass() 
    { 
    } 
    public string valueIWantToChange {get; set;} 
} 

MyPage.cs

public MyPage() 
{ 
    InitializeComponent(); 
    List<itemClass> listOfItems= new List<itemClass>(); 
    itemClass item1= new itemClass { valueIWantToChange = "UnClicked"}; 
    listOfItems.Add(item1); 
    BindingContext = this; 
    lstView.ItemsSource = listOfItems; 

    lstView.ItemSelected += (sender, e) => 
    { 
     if (e.SelectedItem == null) 
     { 
      return; 
     } 

     // The below does nothing but highlights what I am trying to achieve 
     ((itemClass)((ListView)sender).SelectedItem).valueIWantToChange = "Clicked" ; 

     ((ListView)sender).SelectedItem = null; 
    }; 
} 

Meine XAML

<?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:myProject="clr-namespace:myProject" 
     x:Class="myProject.MyPage"> 

    <StackLayout> 
     <ListView x:Name="lstView"> 
      <ListView.ItemTemplate> 
      <DataTemplate> 
       <ViewCell> 
       <StackLayout Padding="0" Orientation="Vertical" VerticalOptions="FillAndExpand" HorizontalOptions="FillAndExpand"> 
        <Label Text="{Binding valueIWantToChange }" TextColor="Black" FontSize="16" VerticalOptions="Center" HorizontalOptions="Center" Margin="5,5,5,5"/> 
       </StackLayout> 
       </ViewCell> 
      </DataTemplate> 
      </ListView.ItemTemplate> 
     </ListView> 
    </StackLayout> 

</ContentPage> 

Ich habe versucht, Binding-Befehle und PropertyChangedEventHandler zu verwenden, aber ohne Erfolg. Jede Hilfe in diesem würde sehr geschätzt werden.

bearbeiten

ich versucht habe PropertyChangedEventHandlers in ähnlicher Art und Weise zu verwenden, an anderer Stelle in der App finden Sie unter:

public double FontXLarge 
    { 
     set 
     { 
      someFontsize = value; 
      OnPropertyChanged("FontXLarge"); 
     } 
     get 
     { 
      someFontsize = scalableFont(10); 
      return someFontsize; 
     } 
    }   

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 

Die oben ermöglicht es mir, eine Schrift zu, dass zu binden Skalierung Schriftart, aber wenn ich etwas ähnliches für Zeichenfolge verwenden würde, würde es nicht alle Elemente in der ListView auswirken?

Antwort

1

Ich denke, der beste Weg zu implementieren, was Sie wollen, ist es, ein ViewModel mit INotifyPropertyChanged zu verwenden. Sie können viele Beispiele finden, wenn Sie ein wenig googlen. Ein guter Link für die generische Basisklasse ist this.

Lassen Sie mich wissen, wenn Sie alles finden, was Sie brauchen.

+0

Vielen Dank für die Antwort, sehr geschätzt. Ich habe tatsächlich bereits ein Viewmodel mit einem PropertyChangedEventHandler ausprobiert, aber ich konnte es nicht zum Laufen bringen, das könnte vielleicht auf den "BindingContext" zurückzuführen sein. Ich dachte auch, dass wenn man eine Variable im Viewmodel hat, dies alle Listenelemente beeinflussen würde? – Aphire

+0

In Ihrem ** ViewModel ** müssen Sie eine 'ObservableCollection erstellen oder für jedes Feld eine Eigenschaft mit' get' und 'set' implementieren und im Set 'OnPropertyChanged (" ");' – Enrico

+0

Bitte sehen Sie meine Bearbeitung, ich denke, es kann erklären, was ich gerade gesagt habe etwas besser – Aphire

Verwandte Themen