Первоначально я думал, что я мог бы использовать 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
, код обновляет прикрепленное свойство до Count
SelectedItems
, поэтому они всегда находятся в синхронизации.
Тогда в XAML, вам нужно будет сначала прикрепить помощника к ListView
(для того, чтобы восстановить экземпляр ListView
и подписаться на его SelectionChanged
событие),
<ListView x:Name="myList" local:ListViewEx.AttachListView="true"
и, наконец, обновить связывание в TextBlock
xaml.
<TextBlock Text="{Binding Path=(local:ListViewEx.SelectedItemsCount), ElementName=myList}" />
Спасибо за ответ. Я пробую ваш образец, но я не уверен, что его можно будет использовать в * Page.Resources * - из-за 'ElementName = myList'. – Romasz
Он тоже должен работать. Я устал. :) –
Вы правы, я поместил ваш код в свой пример, где я включил ItemClick, и я что-то придумал. В настоящее время работает. У вас есть идея, как избавиться от этого ElementName - определить один стиль, который можно использовать для многих страниц? – Romasz