2012-04-18 2 views
1

Я запутался, пытаясь связать некоторые свойства, размещенные внутри коллекции, а не свойства элементов. Я даже не знаю, как выразить это правильно ... код может лучше объяснить: вот типы (не фактический код, я укоротить его основы):Привязка к объектам коллекции DatagridSource вместо отдельных элементов

public class myType 
{ 
    public int P {get;set;} 
} 
public class myTypeCollection : ObservableCollection<myType> 
{ 
    public int Ptotal {get { return this.Items.Select(i=>i.P).Aggregate((c,t)=>t = t + c); }} 
    public int Pmin { get { this.Items.Min(i => i.P); } } //concept 
    public int Pmax { get { this.Items.Max(i => i.P); } } //concept 
} 

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

<!-- myGridObject = new myTemplatedControl(); --> 
<!-- myGridObject.DataContext = new myTypeCollection(); --> 
<!-- NOTE: collection obviously is NOT empty in the real code --> 
<sdk:DataGrid ItemsSource={Binding DataContext}> 
    <sdk:DataGridTemplateColumn Width="Auto"> 
     <sdk:DataGridTemplateColumn.HeaderStyle> 
      <Style TargetType="sdk:DataGridColumnHeader"> 
       <Setter Property="ContentTemplate"> 
        <Setter.Value> 
         <DataTemplate> 

          <!-- ?????? write out Ptotal in the header of the column ??????? --> 
          <!-- This throws a binding-related ArgumentException --> 
          <TextBlock Text="{Binding ???? Ptotal ?????}" /> 

    <!-- closing tags cut off --> 
    <sdk:DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding P}" /> 
    <!-- closing tags cut off once more--> 

{Binding P} работает, как и следовало ожидать, так как P является свойством элементов, но как получить доступ к свойствам коллекции, например, Ptotal, Pmin и т. д.?

Спасибо, что нашли время, чтобы прочитать это. Если какая-либо информация отсутствует, просто укажите ее, и я отправлю ее.

+0

Retagged, чтобы уточнить, что это Silveright 4 – Alex

ответ

0

Оказывается, клиент изменил свое мнение о заголовках сетки, он не хочет отображаться в общей сложности заголовок больше.

Кстати, я, должно быть, пробовал 20 различных подходов, включая исправления в различных типах преобразователей, но я не смог выполнить эту задачу не по-простому-как-бытию.

Еще раз спасибо за все же интересные предложения.

0

Для этого вам нужен объект коллекции в качестве источника привязки.

Вам нужно это:

RelativeSource MarkupExtension

Binding.RelativeSource Property

Что-то вроде этого (не проверено):

<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, 
AncestorType={x:Type myTemplatedControl}}, Path=DataContext.Ptotal}" /> 

Если DataGrid находится внутри пользовательских myTemplatedControl. Мне не совсем понятно, что такое myGridObject. Основная идея заключается в том:

Как сказана в документации MSDN: Binding.RelativeSource Gets or sets the binding source by specifying its location relative to the position of the binding target.

Если вы застряли с й: расширением типа, вот ссылка об этом, так что вы можете использовать его с таможенным контролем:

X:Type

Другой подход, если вы называете ваш контейнер элемент (где ваша коллекция является DataContext), то вы можете установить этот элемент в качестве обязательного источника:

<TextBlock Text="{Binding ElementName=yourElementName, Path=DataContext.Ptotal}" /> 
+0

Спасибо. Я делаю снимок «другого подхода», выглядит правильно. – Alex

+0

Код не хочет выполнять сегодня: метод elementName разрешил исключения, но текстовый блок остается пустым. Собираюсь настроить больше. Что касается пояснения, 'myGridObject' - это имя шаблонного элемента управления в« основном »приложении – Alex

+0

проверяет привязки исключений в окне вывода VS во время отладки приложения. есть ли какое-либо обязательное исключение? –

0

Я думаю, проблема в том, что DataGrid привязан к коллекции, и каждая строка привязана к отдельному элементу, а не коллекции. Вам нужно получить доступ к уровню вверх по цепочке (обратно к самой коллекции).

Если вы используете Silverlight 4+, вы можете использовать источник родственников. Например:

<TextBlock Text="{Binding Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType=sdk:DataGrid, AncestorLevel=1}, Path=DataContext.Count}" 

В противном случае возможно создать статический доступ к контексту, чтобы получить доступ к нему с помощью связывания Source

+0

Спасибо. Попробуйте это прямо сейчас. – Alex

+0

'AncestorType' и' AncestorLevel', похоже, не существуют в типе 'RelativeSource', к сожалению, код as-is не будет компилироваться. – Alex

+0

Я думаю, что работает только в Silverlight 5, можете ли вы обновить свой проект? – user1341566

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