如何从GridView中禁用选择单项?
我有一个GridView,它的ItemsSource绑定到IEnumerable< SampleDataItem>。我希望能够以编程方式不允许选择列表中的某些项目,同时允许选择其他项目。
答案 0 :(得分:7)
虽然我没有这样做,但你应该可以在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;
}
}
答案 1 :(得分:6)
奈杰尔的答案很棒。我刚刚向WinRT XAML Toolkit添加了一些附加属性,如果使用ItemsSource属性绑定填充GridView,这应该会更简单。
对我来说,修改GridViewItem属性的常用方法是使用GridView.ItemContainerStyle属性。使用该方法,您需要使用样式指定IsEnabled属性,样式设置器不支持WinRT中的绑定。使用ItemContainerStyleSelector可能是一种方法,但它需要定义一个自定义类。
我创建了一个带有IsEnabled属性的GridViewItemExtensions class,您可以在GridView.ItemTemplate中的任何控件上设置如下:
xmlns:xyzc="using:Xyzzer.WinRT.Controls"
xyzc:GridViewItemExtensions.IsEnabled="{Binding IsEnabled}"
该属性具有在其祖先可视树中查找GridViewItem并将其IsEnabled值与其后代上设置的GridViewItemExtensions.IsEnabled值保持同步的行为。
然后正如Nigel所说 - 你仍然需要从GridViewItem中提取模板并修改它,以便禁用的项目看起来不合适。