2014-12-21 72 views
1

我試圖擴展我的ListView的ItemContainerStyle一點,並添加一個TextBlock與綁定到一個屬性。它應該顯示ListView.SelectedItems.Count向ListView的ItemContainerStyle添加數字的更好方法是什麼?

現在我有一個工作解決方案,但我不滿意它(我懷疑有更簡單的方法,可能更乾淨)。它是這樣的:

<Style x:Key="MyItemStyle" TargetType="ListViewItem"> 
    <!--Some code-->  
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="ListViewItem"> 
     <!--Some code--> 
     <TextBlock DataContext="{Binding ElementName=contentPresenter, Path=DataContext}" Text="{Binding Number}" Foreground="Red"/> 

的想法很簡單 - 我設置的DataContext 一樣contentPresenter的,這意味着如果我在itemClass時已經財產和我放在那裏Item.Number = myList.SelectedItems.Count;一切工作正常。

但是有沒有其他方法可以在這種風格中做到這一點?沒有額外的財產在我的ItemClass?不知何故可能延長ListViewListViewItem

回答

1

起初我以爲我可以用ElementName結合檢索ListView,然後綁定的TextTextBlockListViewSelectedItems.Count。像下面 -

<!-- this won't work --> 
<TextBlock Text="{Binding Path=SelectedItems, ElementName=myList, Converter="{StaticResource GetCountConverter}"}" /> 

然而,不同於SelectedItem依賴屬性,這是行不通的,因爲SelectedItems僅僅是一個正常的只讀屬性。

一個常見的解決方法是創建一個具有幾個附加屬性的靜態助手類。像這樣的東西 -

public static class ListViewEx 
{ 
    public static int GetSelectedItemsCount(DependencyObject obj) 
    { 
     return (int)obj.GetValue(SelectedItemsCountProperty); 
    } 

    public static void SetSelectedItemsCount(DependencyObject obj, int value) 
    { 
     obj.SetValue(SelectedItemsCountProperty, value); 
    } 

    public static readonly DependencyProperty SelectedItemsCountProperty = 
     DependencyProperty.RegisterAttached("SelectedItemsCount", typeof(int), typeof(ListViewEx), new PropertyMetadata(0)); 

    public static bool GetAttachListView(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(AttachListViewProperty); 
    } 

    public static void SetAttachListView(DependencyObject obj, bool value) 
    { 
     obj.SetValue(AttachListViewProperty, value); 
    } 

    public static readonly DependencyProperty AttachListViewProperty = 
     DependencyProperty.RegisterAttached("AttachListView", typeof(bool), typeof(ListViewEx), new PropertyMetadata(false, Callback)); 

    private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     if ((bool)e.NewValue) 
     { 
      var listView = d as ListView; 
      if (listView == null) return; 

      listView.SelectionChanged += (s, args) => 
      { 
       SetSelectedItemsCount(listView, listView.SelectedItems.Count); 
      }; 
     } 
    } 

基本上我在這裏已經創建了一個SelectedItemsCount附加屬性利用數據綁定。每當SelectionChanged被觸發時,代碼會將附加屬性更新爲SelectedItemsCount,以便它們始終保持同步。

然後在XAML中,您將需要助手先連接到ListView(爲了獲取ListView實例,並認購其SelectionChanged事件),

<ListView x:Name="myList" local:ListViewEx.AttachListView="true" 

;最後,更新綁定xaml的TextBlock

<TextBlock Text="{Binding Path=(local:ListViewEx.SelectedItemsCount), ElementName=myList}" /> 
+0

感謝您的回答。我正在嘗試你的示例,但我不確定是否可以在* Page.Resources *中使用它 - 由於ElementName = myList。 – Romasz

+1

它也應該工作。我累了。 :) –

+0

你說得對,我已經把你的代碼放到了我的例子中,在那裏啓用了ItemClick,而且我已經把東西弄糟了。現在工作。你有一個想法如何擺脫這個ElementName - 定義一個可以在多個頁面中使用的風格? – Romasz

相關問題