listview - 对于绑定(bind) ListView ,如何为选定行绑定(bind)行图标

标签 listview mvvm xamarin.forms syncfusion

我已经与 itam 绑定(bind)了列表,我想为所选项目绑定(bind)成功图标。如何做到这一点,我在 ListView 中为所选项目设置,请参阅该行的成功图标。
enter image description here

我的xml代码:

ViewCell
    ViewCell.View
        Grid
            Grid.RowDefinitions  
                RowDefinition Height="*"Â
                RowDefinition Height="1"Â
            Grid.RowDefinitions  
           Grid
                Grid.ColumnDefinitions
                    ColumnDefinition Width="*"Â
                    ColumnDefinition Width="Auto"Â
                Grid.ColumnDefinitions
                Label Grid.Row="0" Grid.Column="0" LineBreakMode="NoWrap" Text="{Binding NazivRegije}" VerticalOptions="Center" HorizontalOptions="Start" FontAttributes="Bold" TextColor="Teal" FontSize="Medium"
            Grid
            StackLayout Grid.Row="1" Grid.ColumnSpan="2" BackgroundColor="Gray" HeightRequest="1"

            Image Grid.Column="1" x:Name="selectionImage" IsVisible="True" Source="SelectedGreen.png" HorizontalOptions="End" VerticalOptions="Center"
        Grid
    ViewCell.View
/ViewCell

最佳答案

为了满足您的要求,请使用 ListView 的 TapCommand 来更新 IsSelected 属性的值。将 IsSelected 属性和转换器绑定(bind)到 Image 元素的 Source,如下面的代码片段所示,

代码片段 XAML:绑定(bind)属性和转换器到图像源

<ContentPage.Resources> 
    <ResourceDictionary> 
        <local:Converter x:Key="converter"/> 
    </ResourceDictionary> 
</ContentPage.Resources> 

<syncfusion:SfListView ItemsSource="{Binding bookList}"  
                           x:Name="listView" 
                           ItemSize="60" SelectionMode="Single" 
                           SelectionBackgroundColor="AliceBlue" 
                           AllowKeyboardNavigation="True" 
                           TapCommand="{Binding ItemTappedCommand}"> 
        <syncfusion:SfListView.ItemTemplate> 
            <DataTemplate> 
                <Grid> 
                    <Grid.RowDefinitions> 
                        <RowDefinition Height="*" /> 
                        <RowDefinition Height="1" /> 
                    </Grid.RowDefinitions> 
                    <Grid> 
                        <Grid.ColumnDefinitions> 
                            <ColumnDefinition Width="*" /> 
                            <ColumnDefinition Width="Auto" /> 
                        </Grid.ColumnDefinitions> 
                        <Label Grid.Row="0" Grid.Column="0"  
                               LineBreakMode="NoWrap" Text="{Binding Author}"  
                               VerticalOptions="Center" HorizontalOptions="Start"  
                               FontAttributes="Bold" TextColor="Teal" FontSize="Medium" /> 
                    </Grid> 
                    <StackLayout Grid.Row="1" Grid.ColumnSpan="2" BackgroundColor="Gray"  
                                 HeightRequest="1"/> 

                    <Image Grid.Column="1" x:Name="selectionImage"  
                           HeightRequest="30" WidthRequest="30" 
                           Source="{Binding IsSelected, Converter={StaticResource converter}}"  
                           HorizontalOptions="End" VerticalOptions="Center"/> 
                </Grid> 
            </DataTemplate> 
        </syncfusion:SfListView.ItemTemplate> 
    </syncfusion:SfListView>

代码片段 C#:转换器类
class Converter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
        return (bool)value ? "Checked.png" : "Unchecked.png"; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
        throw new NotImplementedException(); 
    } 
}

代码片段 C#:TapCommand 执行方法
private Command<object> _itemTappedCommand; 

public Command<object> ItemTappedCommand { get => _itemTappedCommand; 
set => _itemTappedCommand = value; } 

public ViewModel() 
    { 
        ItemTappedCommand = new Command<object>(ItemTappedExecute); 
    } 

private void ItemTappedExecute(object obj) 
    { 
        bool IsSelected = ((obj as Syncfusion.ListView.XForms.ItemTappedEventArgs).ItemData as BookInfo).IsSelected; 

        foreach (var item in bookList) 
        { 
            item.IsSelected = false; 
        } 
        if (IsSelected) 
        { 
            ((obj as Syncfusion.ListView.XForms.ItemTappedEventArgs).ItemData as BookInfo).IsSelected = false; 
        } 
        else 
        { 
            ((obj as Syncfusion.ListView.XForms.ItemTappedEventArgs).ItemData as BookInfo).IsSelected = true; 
        } 
    }

关于listview - 对于绑定(bind) ListView ,如何为选定行绑定(bind)行图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60152923/

相关文章:

Android ListView : Doesn't highlight on touch, 但在我使用轨迹球时有效

java - 尽管滚动,仍更改 ListView 中单个 View 的背景颜色

c# - 可以级联两个ComboBox,需要级联第三个ComboBox

android - 谷歌云消息 'Not Registered'失败和退订最佳实践?

c# - 使用 Xamarin.forms 使用 RESTful API

android - 在 DialogFragment 中缓慢加载自定义 ArrayAdapter 时,在哪里实现异步任务?

android - 是否有适用于 android 的 super 简单 List/ListAdapter 示例

c# - MVVM - 处理需要在 ViewModel 表示的基础模型上执行的操作

c# - WPF 使用 MVVM 模式在 View 中导航

android - Xamarin.Forms 在 Android 和 IOS 中的设计分离