使特定的 ListView 项目在通用 Windows 平台中不可点击
Make specific ListView item not clickable in Universal Windows Platform
我在 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 中,我们为此使用适配器,我应该如何处理它?
listView 是一个奇怪的控件,因为它没有任何禁用选择的机制。
所以我建议您做的是通过将事件处理程序附加到 ItemSelectionChanged 来处理通知框架已选择项目的事件,并在其中对项目执行取消选择:
yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;
private void yourListView_ItemSelectionChanged(
object sender,
ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
e.Item.Selected = false;
}
如果我的回答有帮助请告诉我:)
首先,您应该在 MyObj
对象中创建一个名为 Disabled
的新 bool
属性。
然后,订阅 myList
的 ContainerContentChanging
事件,您可以在其中访问 ListViewItem
及其对应的 Item
,在本例中是您的 MyObj
。因此,如果 MyObj.Disabled
是 true
,请使 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
。这是因为默认的 ListViewItem
样式有一个 Disabled 状态,减少了它的 Opacity
;而设置 listViewItem.IsHitTestVisible = false
不会以任何方式改变其外观。
我在 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 中,我们为此使用适配器,我应该如何处理它?
listView 是一个奇怪的控件,因为它没有任何禁用选择的机制。
所以我建议您做的是通过将事件处理程序附加到 ItemSelectionChanged 来处理通知框架已选择项目的事件,并在其中对项目执行取消选择:
yourListView.ItemSelectionChanged += yourListView_ItemSelectionChanged;
private void yourListView_ItemSelectionChanged(
object sender,
ListViewItemSelectionChangedEventArgs e)
{
if (e.IsSelected)
e.Item.Selected = false;
}
如果我的回答有帮助请告诉我:)
首先,您应该在 MyObj
对象中创建一个名为 Disabled
的新 bool
属性。
然后,订阅 myList
的 ContainerContentChanging
事件,您可以在其中访问 ListViewItem
及其对应的 Item
,在本例中是您的 MyObj
。因此,如果 MyObj.Disabled
是 true
,请使 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
。这是因为默认的 ListViewItem
样式有一个 Disabled 状态,减少了它的 Opacity
;而设置 listViewItem.IsHitTestVisible = false
不会以任何方式改变其外观。