Связывание 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, никогда не использует слова, которым уже дана функция в С#.