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?
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
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
Bitte sehen Sie meine Bearbeitung, ich denke, es kann erklären, was ich gerade gesagt habe etwas besser – Aphire