Die vorherigen Antworten schlagen entweder benutzerdefinierte Renderer vor oder erfordern, dass Sie das ausgewählte Element entweder in Ihren Datenobjekten oder auf andere Weise verfolgen. Dies ist nicht wirklich erforderlich, es gibt eine Möglichkeit, auf ListView
plattformunabhängige Weise mit dem Funktionieren des zu verknüpfen . Dies kann dann verwendet werden, um das ausgewählte Element nach Bedarf zu ändern. Je nach ausgewähltem Status können Farben geändert, verschiedene Teile der Zelle angezeigt oder ausgeblendet werden.
Fügen wir eine IsSelected
Eigenschaft zu unserer hinzu ViewCell
. Es ist nicht erforderlich, es dem Datenobjekt hinzuzufügen. In der Listenansicht wird die Zelle ausgewählt, nicht die gebundenen Daten.
public partial class SelectableCell : ViewCell {
public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(SelectableCell), false, propertyChanged: OnIsSelectedPropertyChanged);
public bool IsSelected {
get => (bool)GetValue(IsSelectedProperty);
set => SetValue(IsSelectedProperty, value);
}
private static void OnIsSelectedPropertyChanged(BindableObject bindable, object oldValue, object newValue) {
var cell = ((SelectableCell)bindable);
}
}
Um die fehlende Verbindung zwischen den Zellen und der Auswahl in der Listenansicht herzustellen, benötigen wir einen Konverter (die ursprüngliche Idee stammt aus dem Xamarin-Forum ):
public class IsSelectedConverter : IValueConverter {
public object Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
value != null && value == ((ViewCell)parameter).View.BindingContext;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) =>
throw new NotImplementedException();
}
Wir verbinden die beiden mit diesem Konverter:
<ListView x:Name="ListViewName">
<ListView.ItemTemplate>
<DataTemplate>
<local:SelectableCell x:Name="ListViewCell"
IsSelected="{Binding SelectedItem, Source={x:Reference ListViewName}, Converter={StaticResource IsSelectedConverter}, ConverterParameter={x:Reference ListViewCell}}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
Diese relativ komplexe Bindung dient dazu, zu überprüfen, welches tatsächliche Element aktuell ausgewählt ist. Es vergleicht die SelectedItem
Eigenschaft der Listenansicht mit der BindingContext
der Ansicht in der Zelle. Dieser Bindungskontext ist das Datenobjekt, an das wir tatsächlich binden. Mit anderen Worten, es wird geprüft, ob das Datenobjekt, auf das gezeigt SelectedItem
wird, tatsächlich das Datenobjekt in der Zelle ist. Wenn sie gleich sind, haben wir die ausgewählte Zelle. Wir binden dies an die IsSelected
Eigenschaft, die dann in XAML oder Code dahinter verwendet werden kann, um festzustellen, ob sich die Ansichtszelle im ausgewählten Zustand befindet.
Es gibt nur eine Einschränkung: Wenn Sie ein standardmäßig ausgewähltes Element festlegen möchten, wenn Ihre Seite angezeigt wird, müssen Sie ein bisschen clever sein. Leider hat Xamarin Forms keine Seite angezeigt Ereignis, wir haben nur Erscheinen und dies ist zu früh, um die Standardeinstellung festzulegen: Die Bindung wird dann nicht ausgeführt. Verwenden Sie also eine kleine Verzögerung:
protected override async void OnAppearing() {
base.OnAppearing();
Device.BeginInvokeOnMainThread(async () => {
await Task.Delay(100);
ListViewName.SelectedItem = ...;
});
}