2015-09-16 52 views
0

我的Windows Phone 8.1中有一個ListView,其中可以選擇多個項目。一些項目不能在其中選擇。我已經爲這兩種物品定義了DataTemplate選擇器。我用於綁定的類有一個IsSelectable屬性,它決定使用哪個DataTemplate如何在Windows Phone 8.1中禁用某些項目的選擇ListView

<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)。但它似乎沒有工作。

回答

0

在您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; 
    } 
} 
+0

我試過上述方法併成功禁用該項目的選擇,但CheckBox仍然可見。如果選擇被禁用,我想隱藏CheckBox。 –

+0

哦,我忘記了它在Windows手機上的樣子(ListView附近的複選框...)。 對不起,我不知道如何刪除這個複選框。 – RavingDev

相關問題