2015-07-09 2 views
1

У меня есть несколько вложенных элементов управления, которые, похоже, не наследуют привязки правильно ... или это может быть что-то совсем другое. Я немного новичок в WPF.DataGrid в ListBox ItemTemplate не наследует привязки?

У меня есть ObservableCollection объектов, связанных с ListBox, и на верхнем уровне это, кажется, работает, поскольку строка добавляется для каждого элемента в коллекции, как ожидалось. Проблема заключается в том, что мне нужно поместить DataGrid в ItemTemplate в ListBox и ...

DataGrids with headers only

Все я получаю те заголовки, которые я заданные вручную. Нет данных из связанных объектов.

Я, наверное, только что сделал что-то немое. Вот код, немного упрощена:

XAML:

<ListBox x:Name="ReportListBox" Margin="10,10,10,10" Grid.Row="1" ItemsSource="{Binding Path=SummaryTotals, Mode=OneWay}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <DataGrid> 
         <DataGrid.Columns> 
          <DataGridTextColumn Binding="{Binding Date, StringFormat=\{0:MM/dd/yyyy\}}" Header="Date"/> 
          <DataGridTextColumn Binding="{Binding GrossRevenue}" Header="Gross Revenue" /> 
          <DataGridTextColumn Binding="{Binding OurRevenue}" Header="Our Revenue" /> 
          <DataGridTextColumn Binding="{Binding Cost}" Header="Cost" /> 
          <DataGridTextColumn Binding="{Binding Profit}" Header="Profit" /> 
          <DataGridTextColumn Binding="{Binding Roi}" Header="ROI" /> 
          <DataGridTextColumn Binding="{Binding Rpc}" Header="RPC" /> 
          <DataGridTextColumn Binding="{Binding Clicks}" Header="Clicks" /> 
          <DataGridTextColumn Binding="{Binding Conversions}" Header="Conversions" /> 
          <DataGridTextColumn Binding="{Binding ConversionRate}" Header="Conversion Rate" /> 
         </DataGrid.Columns> 
        </DataGrid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

C#:

public class SummaryTotalRecord 
     { 
      public DateTime Date { get; set; } 
      public decimal Cost { get { return Google.Cost + Ypa.PureLocal.Cost + Ypa.BuyerPricer.Cost; } } 
      public decimal GrossRevenue { get { return Google.GrossRevenue + Ypa.PureLocal.GrossRevenue + Ypa.BuyerPricer.GrossRevenue; } } 
      public decimal OurRevenue { get { return Google.OurRevenue + Ypa.PureLocal.OurRevenue + Ypa.BuyerPricer.OurRevenue; } } 
      public decimal Roi { get { return (Google.Roi + Ypa.PureLocal.Roi + Ypa.BuyerPricer.Roi)/3; } } 
      public decimal ConversionRate { get { return (Google.ConversionRate + Ypa.PureLocal.ConversionRate + Ypa.BuyerPricer.ConversionRate)/3; } } 
      public decimal Profit { get { return Google.Profit + Ypa.PureLocal.Profit + Ypa.BuyerPricer.Profit; } } 
      public decimal Rpc { get { return (Google.Rpc + Ypa.PureLocal.Rpc + Ypa.BuyerPricer.Rpc)/3; } } 
      public long Clicks { get { return Google.Clicks + Ypa.PureLocal.Clicks + Ypa.BuyerPricer.Clicks; } } 
      public long Conversions { get { return Google.Conversions + Ypa.PureLocal.Conversions + Ypa.BuyerPricer.Conversions; } } 
      // ... plus a bunch of other properties I haven't touched yet 
     } 

public ObservableCollection<SummaryTotalRecord> SummaryTotals = new ObservableCollection<SummaryTotalRecord>(); 

Я нашел других с подобными проблемами и принятым исправлением, кажется, что-то вроде

RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type ListBox}} 

Но ни то, ни x:Type ListItem, похоже, не имеют каких-либо различий в результатах.

Обновление: Пробуждение нового метода с похожими результатами. Я изменил свой класс, чтобы вернуть объект DataTable с именем TableData и модифицировал XAML следующим образом:

<Expander IsExpanded="True" Header="{Binding Date, StringFormat=\{0:MM/dd/yyyy\}}"> 
         <DataGrid DataContext="{Binding Path=TableData}" AutoGenerateColumns="True" /> 
        </Expander> 

Похожие результаты:

Expanders can access but DataGrids can't?

расширителя имеет доступ к Date собственности, но DataGrid он содержит не имеет доступа к TableData?

+0

Как насчет 'x: Тип ListBoxItem'? –

+0

Хороший звонок, но не кости. Я попытался добавить это к свойствам привязки datagrid - и когда это не сработало, отдельные столбцы - все еще видны только заголовки. –

+0

Можете ли вы вставить одну из ошибок привязки, которые вы получаете в окне вывода? –

ответ

1

я в конечном итоге добавив новое свойство связанного объекта:

общественного DataTable TableData { получить { вар таблица = новый DataTable();

   table.Columns.Add("Date", typeof (string)); 
       table.Columns.Add("Gross Revenue", typeof(string)); 
       table.Columns.Add("Our Revenue", typeof(string)); 
       table.Columns.Add("Cost", typeof(string)); 
       table.Columns.Add("Profit", typeof(string)); 
       table.Columns.Add("ROI", typeof(string)); 
       table.Columns.Add("RPC", typeof(string)); 
       table.Columns.Add("Clicks", typeof(long)); 
       table.Columns.Add("Conversions", typeof(long)); 
       table.Columns.Add("Conversion Rate", typeof(string)); 

       table.Rows.Add(
        Date.ToString("MM/dd/yyyy"), 
        GrossRevenue.ToString("C"), 
        OurRevenue.ToString("C"), 
        Cost.ToString("C"), 
        Profit.ToString("C"), 
        Roi.ToString("P"), 
        Rpc.ToString("P"), 
        Clicks, 
        Conversions, 
        ConversionRate.ToString("P") 
       ); 

       return table; 
      } 
     } 

В этот момент следующий XAML работал:

<DataGrid ItemsSource="{Binding Path=TableData}" AutoGenerateColumns="True" 
CanUserAddRows="False" /> 

Я до сих пор понятия не имею, почему исходный код не удалось, и этот код работает.

0

Имеет смысл, почему сетка была пуста; он не был привязан к какой-либо коллекции. Если источник не указан, то его нет, и сетка будет пустой. Это не то, что может быть обусловлено механизмом привязки.

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