如何禁用 GridView 中的选择单个项目?
我有一个 GridView,它的 ItemsSource 绑定到 IEnumerable<SampleDataItem>。我希望能够以编程方式不允许选择列表中的某些项目,同时允许选择其他项目。
如何禁用 GridView 中的选择单个项目?
我有一个 GridView,它的 ItemsSource 绑定到 IEnumerable<SampleDataItem>。我希望能够以编程方式不允许选择列表中的某些项目,同时允许选择其他项目。
虽然我没有这样做,但您应该能够在 GridView 上使用 ItemContainerStyleSelector,该方法为您提供容器 (GridViewItem) 和您要绑定的项目。从那里您可以将 GridViewItem 上的 IsEnabled 属性设置为 false ,使其无法选择。
您可能还需要选择自定义样式,因为默认的 GridViewItem 样式将自定义禁用项目的外观。
更新DataTemplateSelector 解决方案
public class IssueGridTemplateSelector : DataTemplateSelector
{
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
var selectorItem = container as SelectorItem;
if (item is Issue)
return IssueTemplate;
selectorItem.IsEnabled = false;
selectorItem.Style = RepositoryItemStyle;
return RepositoryTemplate;
}
public DataTemplate IssueTemplate
{
get;
set;
}
public DataTemplate RepositoryTemplate
{
get;
set;
}
public Style RepositoryItemStyle
{
get;
set;
}
}
奈杰尔的回答很棒。我刚刚向WinRT XAML 工具包添加了一些附加属性,如果您使用 ItemsSource 属性绑定来填充 GridView,这些属性应该会更简单。
对我来说,修改 GridViewItem 属性的常用方法是使用 GridView.ItemContainerStyle 属性。使用该方法,您需要使用样式指定 IsEnabled 属性,并且样式设置器不支持 WinRT 中的绑定。使用 ItemContainerStyleSelector 可能是一种方法,但它需要定义一个自定义类。
我创建了一个带有 IsEnabled 属性的GridViewItemExtensions 类,您可以在 GridView.ItemTemplate 中的任何控件上设置该属性,如下所示:
xmlns:xyzc="using:Xyzzer.WinRT.Controls"
xyzc:GridViewItemExtensions.IsEnabled="{Binding IsEnabled}"
该属性具有在其祖先可视树中查找 GridViewItem 并保持其 IsEnabled 值与其后代上设置的 GridViewItemExtensions.IsEnabled 值同步的行为。
然后正如奈杰尔所说 - 您仍然需要从 GridViewItem 中提取模板并对其进行修改,以便禁用的项目看起来不合适。