введите код здесь. Моя собственность из объекта не будет отображаться в Datagrid.
Я ожидаю строку в категории столбца, которая определена в XAML этого проекта. «Идентификатор» и «Описание» успешно отображаются в DataGrid, а «Категория» — нет. См. Скриншот ниже.
<Grid>
<DataGrid Name = "view" AutoGenerateColumns = "False" Margin = "-4,0,4,0" >
<DataGrid.Columns>
<DataGridTextColumn Header = "#" Binding = "{Binding Id}" />
<DataGridTemplateColumn Header = "Category">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content = "{Binding Category.Name}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header = "Description">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content = "{Binding Beschreibung}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
public MainWindow()
{
DataContext = this;
InitializeComponent();
Start();
}
public void Start()
{
var payments = new List<Payment>();
using (var dc = new DataContext())
{
payments = (from c in dc.Categories
join p in dc.Payments
on c.Id equals p.CategoryId
select p).ToList();
}
view.ItemsSource = payments;
}
}
Вот мой класс оплаты
public partial class Payment
{
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Required]
[StringLength(500)]
public string Beschreibung { get; set; }
public DateTime Datum { get; set; }
public int Amount { get; set; }
public int IsIncome { get; set; }
public int CategoryId { get; set; }
public virtual Category Category { get; set; }
}
А вот и мой класс категории
public partial class Category
{
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
public Category()
{
Payments = new HashSet<Payment>();
}
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Id { get; set; }
[Required]
[StringLength(500)]
public string Name { get; set; }
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
public virtual ICollection<Payment> Payments { get; set; }
}
Покажите свою категорию и класс оплаты.
2 класса показаны сейчас
Разве это не рекурсивно, так как у вас есть список платежей внутри категорий внутри платежа?
Лучше реализовать шаблон MVVM, пожалуйста, посмотрите:
Итак, ваша ошибка в том, что в вашем linq вы выбираете p (Payments) и, возможно, там свойство Category пусто. Вы можете быстро просмотреть результат запроса и посмотреть его.
Я отладил свою программу и ее любопытство, когда-то категория свойств в объектных платежах нулевая, а иногда нет, без каких-либо изменений
Попробуйте изменить этот код
payments = (from c in dc.Categories
join p in dc.Payments
on c.Id equals p.CategoryId
select p)
.ToList();
к
payments = (from c in dc.Categories
join p in dc.Payments
on c.Id equals p.CategoryId
select p)
.Include("Category")
.ToList();
Он с готовностью загрузит Category
из базы данных и должен решить вашу проблему.
Оно работает!!! Спасибо, Александр, не могли бы вы объяснить мне, в чем разница между моим и вашим выбором? (Я новичок в инфраструктуре сущностей)
@NikolaMatovic см. эти документы docs.microsoft.com/en-us/ef/ef6/querying/related-data. Короче говоря, все свойства, помеченные как virtual
, по умолчанию загружаются отложенно. Это означает, что они не заполняются никакими данными, когда вы выбираете их из базы данных. Но когда вы ссылаетесь на свойство в коде, данные загружаются. Но кажется, что WPF делает что-то еще, кроме ссылки на свойство, когда связывает его значение. Таким образом, вы просто указываете EF вручную загрузить этот объект для вас в одном запросе.
Можете ли вы поделиться своим классом DataContext, Categories и Payments?