2015-09-16 4 views
1

Я новичок в WPF и просто пытаюсь привязать голову к привязке, я могу получить привязку datagrid, но я должен сделать это определенным образом. Вот мой класс, что если я захвачу данные в конструкторе, как показано, он работает. У меня есть datacontext, связанный с классом Attorney, и источник элемента в свойство AttyList. У меня также работает INotifyChanged.WPF привязка к DataGrid

public class Data : CommonBase 
{ 
    public Data() 
    { 
     getAtty(); 
    } 
    private List<Attorneys> _AttyList; 

    public List<Attorneys> AttyList 
    { 
     get { return _AttyList; } 
     set 
     { 
      if(value != this._AttyList) 
      { 
       _AttyList = value; 
       NotifyPropertyChanged("AttyList"); 
      } 

     } 
    } 

    public void getAtty() 
    { 
     AttyList = new List<Attorneys>(); 
     using (var context = new Context()) 
     { 
      AttyList = context.Attorney.ToList(); 
     } 
    } 

} 

Но, позволяет сказать, что я не хочу называть getAtty() в конструкторе, но в коде позади файла Xaml, как это так,

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     var odata = new Data(); 
     odata.getAtty(); 

    } 

По какой-то причине, DataGrid Безразлично Население? Я знаю, что могу сделать это в конструкторе первого сообщения кода, но если я хочу называть его индивидуально, а не когда у меня есть новый экземпляр, я не могу. Что я делаю не так?

Edit: Вот большинство моих XAML:

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 

    xmlns:local="clr-namespace:testWPF" 
    xmlns:Models="clr-namespace:testWPF.Models" x:Class="testWPF.MainWindow" 
    mc:Ignorable="d" 

    Title="MainWindow" Height="350" Width="525" WindowState="Maximized" Loaded="Window_Loaded"> 
<Grid> 
    <Grid.Background> 
     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
      <GradientStop Color="#FF3E0213" Offset="0.116"/> 
      <GradientStop Color="White" Offset="1"/> 
      <GradientStop Color="#FF970202" Offset="0.983"/> 
     </LinearGradientBrush> 
    </Grid.Background> 

    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="35*"/> 
     <ColumnDefinition Width="12*"/> 
    </Grid.ColumnDefinitions> 
    <DataGrid x:Name="dgvAllAttorneys" HorizontalAlignment="Left" Margin="84,26,0,0" MouseDoubleClick="dgvAllAttorneys_MouseDoubleClick" VerticalAlignment="Top" Height="154" Width="208" ItemsSource="{Binding AttyList}" AutoGenerateColumns="False" SelectionMode="Single" IsReadOnly="True" Grid.ColumnSpan="1"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding FirstName}" ClipboardContentBinding="{x:Null}" Header="FirstName"/> 
      <DataGridTextColumn Binding="{Binding FullName}" ClipboardContentBinding="{x:Null}" Header="LastName" Width="*"/> 
     </DataGrid.Columns> 
     <DataGrid.DataContext> 
      <Models:Data/> 
     </DataGrid.DataContext> 
    </DataGrid> 

</Grid> 
+0

Это поможет, если вы вывесили ваш XAML также. –

+1

Как упоминалось другими, используйте список ObservableCollection вместо списка. Кроме того, как вы привязываете свою сетку к коллекции? – PoweredByOrange

+0

Я добавил свой XAML, там не очень много. Я попробовал коллекцию Observable. Все еще не было заполнение Грида. Если я вызову getAtty() из конструктора класса Data, сетка работает нормально. – Dylan

ответ

2

Используйте ObservableCollection<Attorneys> вместо списка поэтому DataGrid уведомляется об изменениях.

public class Data : CommonBase 
{ 
    public Data() 
    { 
     getAtty(); 
    } 
    private ObservableCollection<Attorneys> _AttyList; 

    public ObservableCollection<Attorneys> AttyList 
    { 
     get { return _AttyList; } 
     set 
     { 
      if(value != this._AttyList) 
      { 
       _AttyList = value; 
       NotifyPropertyChanged("AttyList"); 
      } 
     } 
    } 

    public void getAtty() 
    { 
     AttyList = new ObservableCollection<Attorneys>(); 
     using (var context = new Context()) 
     { 
      AttyList = context.Attorney.ToList(); 
     } 
    } 
} 

В вашем XAML, где вы установили свой DataContext, укажите этому экземпляру имя.

<DataGrid.DataContext> 
    <Models:Data x:Name="dataContext" /> 
<DataGrid.DataContext> 

Затем в Loaded обработчика событий окна, ссылки, что экземпляр для вызова getAtty()

private void Window_Loaded(object sender, RoutedEventArgs e) 
{ 
    dataContext.getAtty(); 
} 
+0

ok, я изменил attylist на Observable collection, затем я изменил функцию getatty() на это и все еще не работал. AttyList = новый ObservableCollection (список); – Dylan

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