【问题标题】:How to disable selection for some items in Windows Phone 8.1 ListView如何禁用 Windows Phone 8.1 ListView 中某些项目的选择
【发布时间】:2015-09-16 17:06:13
【问题描述】:

我的 Windows Phone 8.1 中有一个 ListView,可以在其中选择多个项目。其中有一些项目是不可选择的。我为这两种项目定义了一个DataTemplate 选择器。我用于绑定的类有一个IsSelectable 属性,它确定要使用哪个DataTemplate

<ListView SelectionMode="Multiple">
<ListView.ItemTemplate>
<DataTemplate x:Key="KeyValueDataTemplate">
        <utils:KeyValueTemplateSelector HorizontalAlignment="Stretch" Content="{Binding}">
            <utils:KeyValueTemplateSelector.NotSelectable>
                <DataTemplate>
                    <!-- some controls -->
                </DataTemplate>
            </utils:KeyValueTemplateSelector.NotSelectable>
            <utils:KeyValueTemplateSelector.Selectable>
                <DataTemplate>
                    <!-- some controls -->
                </DataTemplate>
            </utils:KeyValueTemplateSelector.Selectable>
        </utils:KeyValueTemplateSelector>
    </DataTemplate>
</ListView.ItemTemplate>
</ListView>

使用SelectionMode="Multiple" 选项会自动在每个项目旁边显示CheckBox。对于不可选择的项目,我需要隐藏 CheckBox。我尝试编辑ListViewItemStyle 并绑定复选框VisibilityIsSelectable(使用BooleanToVisibilityConverter)。但它似乎不起作用。

【问题讨论】:

    标签: c# windows-phone-8.1 windows-8.1


    【解决方案1】:

    在 DataTemplate 的任何部分设置此属性:

    local:SelectorHelper.IsItemSelectionEnabled="{Binding IsSelectable}"
    

    例子:

    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid local:SelectorHelper.IsItemSelectionEnabled="{Binding IsSelectable}">
                <!-- -->
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
    

    这是我的 SelectorHelper:

    public static class SelectorHelper
    {
        public static readonly DependencyProperty IsItemSelectionEnabledProperty =
            DependencyProperty.RegisterAttached("IsItemSelectionEnabled", typeof(bool), typeof(SelectorHelper), new PropertyMetadata(true, IsItemSelectionEnabledChanged));
    
    
        public static void SetIsItemSelectionEnabled(DependencyObject dependencyObject, bool value)
        {
            dependencyObject.SetValue(IsItemSelectionEnabledProperty, value);
        }
    
        public static bool GetIsItemSelectionEnabled(DependencyObject dependencyObject)
        {
            return (bool)dependencyObject.GetValue(IsItemSelectionEnabledProperty);
        }
    
    
        private static void IsItemSelectionEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var frameworkElement = (FrameworkElement)d;
            var selectorItem = XamlTreeHelper.FindParent<SelectorItem>(frameworkElement);
            if (selectorItem != null)
            {
                selectorItem.IsEnabled = GetIsItemSelectionEnabled(frameworkElement);
            }
            else
            {
                frameworkElement.Loaded -= OnSelectableItemLoaded;
                frameworkElement.Loaded += OnSelectableItemLoaded;
            }
        }
    
        private static void OnSelectableItemLoaded(object sender, RoutedEventArgs e)
        {
            var frameworkElement = (FrameworkElement)sender;
            var selectorItem = FindParent<SelectorItem>(frameworkElement);
            if (selectorItem != null)
            {
                selectorItem.IsEnabled = GetIsItemSelectionEnabled(frameworkElement);
            }
        }
    
        private static T FindParent<T>(DependencyObject child) where T : DependencyObject
        {
            var currentObject = child;
            do
            {
                currentObject = VisualTreeHelper.GetParent(currentObject);
                var parent = currentObject as T;
                if (parent != null)
                {
                    return parent;
                }
            } while (currentObject != null);
    
            return null;
        }
    }
    

    【讨论】:

    • 我尝试了上述方法,它成功地禁用了对该项目的选择,但 CheckBox 仍然可见。如果选择被禁用,我想隐藏 CheckBox。
    • 哦,我忘了它在 Windows phone 上的样子(ListView 附近的复选框...)。抱歉,我不知道如何删除此复选框。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    相关资源
    最近更新 更多