【问题标题】:check checkbox when item selected in listview UWP在列表视图 UWP 中选择项目时选中复选框
【发布时间】:2016-02-13 16:05:57
【问题描述】:

我正在编写一个带有列表视图的 UWP 应用程序。 listviewitems 包含一个文本块和一个复选框。选择 listviewitem 后,我希望复选框选中/取消选中。我还想删除“选定”动画,其中 listviewitem 在被选中时变为蓝色。

我找到了不同的解决方案,但它们似乎都依赖于触发器的使用,Visual Studio 告诉我这在 UWP 中不可用。

如果没有 UWP 中的触发器,我该如何解决这个问题?

我的列表视图:

<ListView Name="ListViewItems" Grid.Row="2">
        <ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Margin" Value="0,0,0,1"></Setter>
                <Setter Property="Background" Value="White"></Setter>
                <Setter Property="Padding" Value="5"></Setter>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <Grid Padding="5,0">
                    <CheckBox HorizontalAlignment="Right" VerticalAlignment="Center" Name="CheckBoxItem"></CheckBox>
                    <TextBlock HorizontalAlignment="Left" VerticalAlignment="Center" Name="TextblockItem" Text="{Binding}"></TextBlock>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

【问题讨论】:

    标签: c# listview checkbox win-universal-app uwp


    【解决方案1】:

    当 listviewitem 被选中时,我希望复选框选中/取消选中。

    您可以直接将IsChecked属性绑定到CheckBox到ListViewItem IsSelected属性:

    <CheckBox 
          HorizontalAlignment="Right" 
          Margin="10"
          VerticalAlignment="Center" 
          IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}}"
          Name="CheckBoxItem">
    </CheckBox>
    

    每当 ListViewItem 的 IsSelected 属性发生变化时,CheckBox 就会被选中/取消选中。

    我还想删除“选定”动画,其中 listviewitem 被选中时变为蓝色。

    下面的代码可以帮助你实现这一点,但是,它覆盖了Item的模板,这意味着你必须编写自己的模板。

                <Style TargetType="{x:Type ListViewItem}">
                    <Setter Property="FocusVisualStyle" Value="{x:Null}" />                    
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type ListViewItem}">
                                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
    

    【讨论】:

    • 看起来是一个干净的解决方案,但您是否尝试过将其绑定到 IsChecked 属性?我读到here Windows Phone 不支持 AncestorType,我似乎也无法让它在 UWP 中工作。 “AncestorType 未注册或不可访问”。
    • 在 Windows Phone 中是不可能的(我测试绑定,但在桌面应用程序上),您可以尝试 Depechie 的解决方案,但要小心,这样做可以混合业务逻辑和UI,因为您在类上创建一个属性只是为了处理一些 UI 逻辑,我建议您为绑定到列表的项目创建一个 Viewmodel。
    • 如果您离开并返回页面,是否仍需要保留所选的内容,这取决于您。然后将属性绑定到视图模型中的对象会有所帮助:)
    • 如果您有一个未缓存的视图并离开它并返回,所有项目将再次被取消选择......所以如果您需要跟踪它,您最好绑定一个字段类的复选框
    【解决方案2】:

    如果 ListView 中的 ItemSource 绑定到 ViewModel 上的集合,我建议您在集合的项目类中添加一个布尔值。

    例如,如果您要显示 Persons,请在 Person 类中添加一个 bool IsSelected 字段。 然后,您可以使用此字段将其绑定到视图中复选框的 IsChecked 属性,唯一需要做的就是确保设置 Mode=TwoWay

    最后要做的是切换这个 IsSelected 字段,您可以通过将 ListView 的 SelectedItem 绑定到 ViewModel 上的 Person 属性来执行此操作,并且每次调用它时(属性的设置器),切换给定的 IsSelected 字段.

    要覆盖ListView的某项被选中时颜色的变化,需要获取ListView模板的副本,并删除选中状态下的颜色设置

    【讨论】:

    • 我遇到了一些类似的问题,您的解决方案对我帮助很大,谢谢
    • 我想在模型中添加选择布尔值会破坏 mvvm。
    猜你喜欢
    • 2014-09-01
    • 2013-09-21
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 2013-08-03
    • 1970-01-01
    • 2019-07-28
    • 2010-10-30
    相关资源
    最近更新 更多