2016-01-13 5 views
1

У меня есть одна страница с Tabcontrol которая содержит два файла: DataGrids. Я могу связать первый без сучка и задоринки, но второй не получит никаких данных. Я чувствую, что это может быть связано с чем-то связанным с DataContext, но я все еще не уверен.DataGrid Not Binding Correctly

Вот как я связываю свои первые DataGrid;

private async void FillDataGrid() 
    { 
     var Companies = new ObservableCollection<CompanyModel>(); 
     var waitWindow = new PleaseWait(); 

     waitWindow.Show(); 
     Companies = await ReturnCompanies(); 
     CompanyICollectionView = CollectionViewSource.GetDefaultView(Companies); 
     DataContext = this; 

     dataGrid.SelectedIndex = 0; 
     waitWindow.Close(); 
    } 

DataGrid сам по себе выглядит следующим образом;

<DataGrid x:Name="dataGrid" ColumnWidth="*" IsReadOnly="true" 
         Margin="10" FontSize="14" 
         HeadersVisibility="Column" AutoGenerateColumns="False" 
         CanUserAddRows="False" SelectionChanged="DataGridSelectionChanged" 
         IsSynchronizedWithCurrentItem="True" 
         EnableRowVirtualization="True" 
         ItemsSource="{Binding CompanyICollectionView}" 
         MinColumnWidth="0">      
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Company Name" Binding="{Binding Name}"/> 
         <DataGridTextColumn Header="Town" Binding="{Binding Town}"/> 
         <DataGridTextColumn Header="Post Code" Binding="{Binding Postcode}"/> 
        </DataGrid.Columns> 
       </DataGrid> 

Мой второй DataGrid связан в очень похожим образом;

private async void FillContactsDataGrid(object sender, MouseButtonEventArgs e) 
    { 
     var Contacts = new ObservableCollection<ContactsModel>(); 
     var waitWindow = new PleaseWait(); 

     waitWindow.Show(); 
     Contacts = await ReturnContacts(); 
     ContactsICollectionView = CollectionViewSource.GetDefaultView(Contacts); 
     DataContext = this; 

     contactsDataGrid.SelectedIndex = 0; 
     waitWindow.Close(); 
    } 

Второй DataGrid;

<DataGrid x:Name="contactsDataGrid" ColumnWidth="*" IsReadOnly="true" 
         Margin="10" FontSize="14" 
         HeadersVisibility="Column" AutoGenerateColumns="False" 
         CanUserAddRows="False" 
         IsSynchronizedWithCurrentItem="True" 
         EnableRowVirtualization="True" 
         ItemsSource="{Binding ContactsICollectionView}" 
         MinColumnWidth="0" 
         Grid.Row="1" Grid.ColumnSpan="2"> 
        <DataGrid.Columns> 
         <DataGridTextColumn Header="Date" Binding="{Binding ContactDate, StringFormat=\{dd-MM-yyyy\}}"/> 
         <DataGridTextColumn Header="To Person" Binding="{Binding PersonName}"/> 
         <DataGridTextColumn Header="Contract" Binding="{Binding Contract}"/> 
         <DataGridTextColumn Header="Type" Binding="{Binding TypeOfContact}"/> 
         <DataGridTextColumn Header="Made By" Binding="{Binding ContactMadeBy}"/> 
         <DataGridTextColumn Header="Contract Summary" Binding="{Binding ContactDescription}"/> 
        </DataGrid.Columns> 
       </DataGrid> 

я петельные через ContactsICollectionView и распечатать детали контактов и не было вопроса, поэтому я знаю, что коллекции заполняются правильно, это просто связывание DataGrids, где я буду неправильно.

+0

используйте https://snoopwpf.codeplex.com/ и проверьте привязку и DataContext во время выполнения – blindmeis

ответ

1

В вашей первой DataGrid вы привязываете коллекцию к методу.
private async void FillDataGrid()

Но для вашей второй сетки, я предполагаю, что это событие (учитывая аргументы за второе отправленное вами событие).
private async void FillContactsDataGrid(object sender, MouseButtonEventArgs e)

Это обработчик событий?

Возможно, проблема связана с тем, что «это» во втором методе (который является обработчиком события) указывает на объект, который поднял это событие, а не объект окна, как в первом методе.

Извините, я не комментировал это. У меня пока нет достаточной репутации, чтобы сделать это.

Надеюсь, это поможет.

ОБНОВЛЕНИЕ Без просмотра всего кода я не могу найти реальную проблему. Следующие могут быть мало полезны
@ProgrammingDude правильный. this относится к классу, к которому принадлежит.

DataContext = this; 

выше линия связывает свой класс (который this точки к) с DataContext. Это делает DataGrid связывается с членами this класса
1. Убедитесь, что обработчик события FillContactsDataGrid находится внутри класса, который указывает на this
2. Убедитесь, что объект ContactsICollectionView является членом класса, который указывает на this
3. Есть ContactsICollectionView недвижимость?

+0

Вы совершенно правы, это делается нажатием TabItem.Что бы вы предложили изменить это? – CBreeze

+0

это все равно относится к экземпляру класса, который я считаю, даже если вы находитесь в событии. https://msdn.microsoft.com/en-us/library/dk1507sz.aspx – ProgrammingDude

+0

@ProgrammingDude Вы правы. это указывает на класс. –