所选项目在ListView中突出显示Xamarin.Forms

时间:2016-04-10 22:54:15

标签: listview xamarin xamarin.forms highlight selected

目前,我创建了一个自定义CellView模板,可以有效地为整个单元格使用背景图像,并具有文本叠加功能。

我是通过绝对布局完成此操作,并将自定义单元格模板绑定到我的ListView 我的问题是,我似乎不再在选择时突出显示一个单元格。

我猜测我的问题源于图像占据了单元格背景的100%(首先将其添加到堆栈布局而不是正确的背景图像),或者我的自定义ViewCell实现是没有正确实施ItemSelection

我的印象是默认情况下ListView单元格会有某种选择突出显示。它使用的是默认ListView,而我使用的是相对布局,其中包含图像外部的一小部分单元格。
这是我能够突出细胞的地方。

图像从未实际突出显示。所以这就是为什么我怀疑图像是问题的原因。

我想要完成的内容

在点击时突出显示整个单元格图像,并使用某种颜色突出显示所有单元格图像以指示它已被选中。在共享代码(PCL)中。

到目前为止,我尝试创建一个不可见的BoxView,其中一些透明度在点击时变得可见;但是我无法弄清楚如何使用ItemSelected()来实现这一点。我不是要求编码解决方案,而是要求指向正确的方向;但是,我不会对编码解决方案提出异议。

public CustomViewCell()
    {
        var someLabel= new Label();
        someLabel.SetBinding (Label.TextProperty, "someLabel");

        var someImage = new Image () {
            Aspect = Aspect.AspectFill,
        };
        someImage.SetBinding (Image.SourceProperty, "ImageSource");

        AbsoluteLayout.SetLayoutFlags (someImage, AbsoluteLayoutFlags.All);
        AbsoluteLayout.SetLayoutBounds (someImage, new Rectangle (0f, 0f, 1f, 1f));

        AbsoluteLayout.SetLayoutFlags (someLabel, AbsoluteLayoutFlags.PositionProportional);
        AbsoluteLayout.SetLayoutBounds (someLabel, 
            new Rectangle (0.1, 0.85, AbsoluteLayout.AutoSize, AbsoluteLayout.AutoSize)
        );

        AbsoluteLayout theLayout = new AbsoluteLayout {
            HeightRequest = 50,
            BackgroundColor = Color.Black
        };

        theLayout.Children.Add (someImage);
        theLayout.Children.Add (someLabel);

        this.View = theLayout;
    }
}

在此之后,我只有绑定的基本访问器,并创建了List /应用模板。如果需要我可以提供,但它们是基本的。

1 个答案:

答案 0 :(得分:0)

惠。 为此,您必须使用Item Selected Property并将其与您的变量绑定,之后执行您想要的操作(例如,使用Name属性与列表中的每个项目进行检查)。

我没有测试过,我想你会抓住这个想法。

以下是您的清单:

MenuItems = new ObservableCollection<MasterPageMenuItemModel>
            {
                new MasterPageMenuItemModel {Name = "GistsPage", ImageSource = GistsPageImagePath},
                new MasterPageMenuItemModel {Name = "IssueDashboardPage", ImageSource = IssueDashboardPageImagePath},
                new MasterPageMenuItemModel {Name = "BookmarksPage", ImageSource = BookmarksPageImagePath},
                new MasterPageMenuItemModel {Name = "ReportAnIssuePage", ImageSource = ReportAnIssuePageImagePath}
            };

好的,现在你有了Name属性。 然后使用&#34; Selected Item&#34;用它绑定你的财产:

<ListView x:Name="MasterPageMenu"
                  SeparatorColor="Transparent"
                  AbsoluteLayout.LayoutBounds="{Binding MasterMenuBounds}"
                  AbsoluteLayout.LayoutFlags="None"
                  ItemsSource="{Binding MenuItems}"
                  SelectedItem="{Binding MenuItemSelectedProperty, Mode=TwoWay}">

要在需要时进行检查,可以使用ItemSelected事件。 当它引发使用你的bindable属性和Name属性时,用它做你想做的事。