Связывание Datagrid в WPF

Я знаю, что это уже было задано, но я сделал почти все, что предлагает разработчик.

<DataGrid x:Name="Imported" VerticalAlignment="Top" DataContext="{Binding Source=list}"  AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding Path=ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Path=Date}"/>
    </DataGrid.Columns>
</DataGrid>

Я пытаюсь показать это в модальном диалоговом окне и заполнять список лицензий в конструкторе модального диалогового окна. Но все же ничего не заполняется внутри datagrid.

Код конструктора:

public diagboxclass()
{
    List<object> list = new List<object>();
    list = GetObjectList();
}

public class object
{
    string id;
    DateTime date;
    public string ID
    {
        get { return id; }
        set { id = value; }
    }
    public DateTime Date
    {
        get { return date; }
        set { date = value; }
    }
}

Вы, ребята, думаете, что-то связано с списком объектов?

Ответ 1

ПОЖАЛУЙСТА, не используйте object имя класса:

public class MyObject //better to choose a appropriate name
{
    string id;
    DateTime date;
    public string ID
    {
       get { return id; }
       set { id = value; }
    }
    public DateTime Date
    {
       get { return date; }
       set { date = value; }
    }
}

Вы должны реализовать INotifyPropertyChanged для этого класса и, конечно, вызвать его в Property setter. В противном случае изменчивость не отражается в вашем ui.

Класс класса/диалогового окна Viewmodel должен иметь Property вашего списка MyObject. ObservableCollection<MyObject> - путь:

public ObservableCollection<MyObject> MyList
{
     get...
     set...
}

В xaml вы должны установить Itemssource в свою коллекцию MyObject. (Datacontext должен быть вашим классом диалогового окна!)

<DataGrid ItemsSource="{Binding Source=MyList}"  AutoGenerateColumns="False">
   <DataGrid.Columns>                
     <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
     <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>

Ответ 2

Не видя указанный список объектов, я считаю, что вы должны привязываться к свойству DataGrid ItemsSource, а не к его DataContext.

<DataGrid x:Name="Imported" VerticalAlignment="Top" ItemsSource="{Binding Source=list}"  AutoGenerateColumns="False" CanUserResizeColumns="True">
    <DataGrid.Columns>                
        <DataGridTextColumn Header="ID" Binding="{Binding ID}"/>
        <DataGridTextColumn Header="Date" Binding="{Binding Date}"/>
   </DataGrid.Columns>
</DataGrid>

(Предполагается, что элемент [UserControl и т.д.], содержащий DataGrid, имеет его DataContext, привязанный к объекту, содержащему коллекцию list. DataGrid получен из ItemsControl, который полагается на свойству ItemsSource, чтобы определить коллекцию, к которой он привязывает свои строки. Следовательно, если list не является свойством объекта, связанного с вашим контролем DataContext, вам может потребоваться установить как DataContext={Binding list}, так и ItemsSource={Binding list} в DataGrid...)

Ответ 3

попробуйте сделать это в коде ниже

   public diagboxclass()
   {
         List<object> list = new List<object>();
         list = GetObjectList();
         Imported.ItemsSource = null;
         Imported.ItemsSource = list;
   }

Также убедитесь, что ваш список эффективно заполнен и, как упоминалось Blindmeis, никогда не использует слова, которым уже дана функция в С#.