2014-12-21 2 views
1

Я пытаюсь расширить свой элемент ListView ItemContainerStyle немного и добавить TextBlock со связыванием с собственностью. Он должен показать ListView.SelectedItems.Count.Какой лучший способ добавить номер в ItemContainerStyle ListView?

На данный момент у меня одно рабочее решение, но я не доволен им (я подозреваю, что есть намного более простой способ и, вероятно, более чистый). Это выглядит следующим образом:

<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 свойство Номер и I положить там Item.Number = myList.SelectedItems.Count; все работает нормально.

Но есть ли другой способ сделать это в этом стиле? Без дополнительного имущества в моем ItemClass? Каким-то образом возможно продлить ListView или ListViewItem?

ответ

1

Первоначально я думал, что я мог бы использовать ElementName связывания для получения ListView, а затем связать Text из вашей TextBlock к ListView «s SelectedItems.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, код обновляет прикрепленное свойство до CountSelectedItems, поэтому они всегда находятся в синхронизации.

Тогда в XAML, вам нужно будет сначала прикрепить помощника к ListView (для того, чтобы восстановить экземпляр ListView и подписаться на его SelectionChanged событие),

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

и, наконец, обновить связывание в TextBlock xaml.

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

Спасибо за ответ. Я пробую ваш образец, но я не уверен, что его можно будет использовать в * Page.Resources * - из-за 'ElementName = myList'. – Romasz

+1

Он тоже должен работать. Я устал. :) –

+0

Вы правы, я поместил ваш код в свой пример, где я включил ItemClick, и я что-то придумал. В настоящее время работает. У вас есть идея, как избавиться от этого ElementName - определить один стиль, который можно использовать для многих страниц? – Romasz

Смежные вопросы