【问题标题】:Make specific ListView item not clickable in Universal Windows Platform使特定 ListView 项目在通用 Windows 平台中不可点击
【发布时间】:2016-05-23 07:37:18
【问题描述】:

我在我的 XAML 中使用 ListView 元素:

                <ListView
                x:Name="myList"
                IsItemClickEnabled="true"
                ItemClick="onDrawerItemClick"
                SelectionMode="Single"
                ScrollViewer.VerticalScrollBarVisibility="Hidden">

                <ListView.ItemTemplate>
                    <DataTemplate>

                        <Grid
                            Width="260">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition
                                    Width="44" />
                                <ColumnDefinition
                                    Width="*" />
                            </Grid.ColumnDefinitions>

                            <Image
                                x:Name="image"
                                Source="{Binding myIcon}"
                                Grid.Column="0" />

                            <TextBlock
                                Text="{Binding myTxt}"
                                Grid.Column="1" />

                        </Grid>

                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>

我使用 Bind 属性填充它,如下所示:

List<MyObj> listData = a list with title + image uri;
myList.ItemsSource = listData;

我只需要根据列表中MyObj 中的某些值禁用某些项目的点击,但其他项目才能拥有它。在Android中我们使用适配器,我应该如何处理它?

【问题讨论】:

标签: c# xaml win-universal-app microsoft-metro uwp


【解决方案1】:

首先,您应该在您的 MyObj 对象中创建一个名为 Disabled 的新 bool 属性。

然后,订阅myListContainerContentChanging 事件,您可以访问ListViewItem 及其对应的Item,在本例中就是您的MyObj。因此,如果 MyObj.Disabledtrue,则使 ListViewItem 不可点击。

private void myList_ContainerContentChanging(ListViewBase sender, ContainerContentChangingEventArgs args)
{
    var listViewItem = args.ItemContainer;

    if (listViewItem != null)
    {
        var model = (MyObj)args.Item;

        if (model.Disabled)
        {
            listViewItem.IsHitTestVisible = false;

            // OR
            //listViewItem.IsEnabled = false;
        }
    }
}

请记住,如果您希望该项目显示为灰色,您可能需要使用 listViewItem.IsEnabled = false。这是因为默认的ListViewItemstyle 有一个Disabled 状态,它减少了它的Opacity;而设置listViewItem.IsHitTestVisible = false 不会以任何方式改变其外观。

【讨论】:

    【解决方案2】:

    listView 是一个奇怪的控件,因为它没有任何机制来禁用选择。

    所以我建议你做的是通过将事件处理程序附加到 ItemSelectionChanged 并在其中对项目执行取消选择来处理通知框架已选择项目的事件:

    yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;
    
    private void yourListView_ItemSelectionChanged(
        object sender,
        ListViewItemSelectionChangedEventArgs e)
    {
       if (e.IsSelected)
          e.Item.Selected = false;
    }
    

    如果我的回答有帮助,请告诉我:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2012-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多