EF6, код первый. Как установить альтернативный источник данных для столбца GridControl с помощью XAML Devexpress
У меня есть два связанных лица:
public class Event
{
public string ID { get; set; }
public DateTime EventDate { get; set; }
public string EventData { get; set; }
public string DocID1 { get; set; }
public int DocID2 { get; set; }
public virtual Document Document1 { get; set; }
public virtual Document Document2 { get; set; }
}
public class Document
{
public string ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Number { get; set; }
}
Также создан список для отображения данных в WPF:
private ObservableCollection<Event> eventList;
public ObservableCollection<Event> EventList
{
get { return eventList; }
set
{
if (value != eventList)
{
eventList = value;
}
RaisePropertyChanged(nameof(EventList));
}
}
Данные для моего EventList взяты из сущности Event:
var query = DBContext.Events.Select(x => x).AsQueryable();
EventList = query.ToList();
Что мне нужно, это как установить значение столбца GridControl "colFirstName" равным "Document1.FirstName", если DocID1 не является нулевым, и "Document2.FirstName", если DocID2 не является нулевым. Мой код XAML для GridControl приведен ниже. Не могли бы вы помочь, как это сделать в Xaml, а не в ViewModel, или, если нет способа сделать это в Xaml, каков наилучший способ сделать это во ViewModel.
<dxg:GridControl AutoPopulateColumns="False"
ItemsSource="{Binding EventList, UpdateSourceTrigger=PropertyChanged}">
<dxg:GridControl.Columns>
<dxg:GridColumn
x:Name="colEventData"
Width="120"
FieldName="EventData"
Header =" Event data"
Visible="True" >
</dxg:GridColumn>
<dxg:GridColumn
x:Name="colFirsnName"
Width="120"
FieldName="Document1.FirstName"
Header="First Name"
Visible="True"
VisibleIndex="1" />
</dxg:GridControl.Columns>
</dxg:GridControl>
2 ответа
Вы можете использовать свойство UnboundExpression, чтобы создать столбец с пользовательским выражением. Например, чтобы условно отобразить значения из разных свойств, используйте функцию Iif:
<dxg:GridColumn FieldName="CustomColumn" x:Name="colFirsnName"
UnboundExpression="Iif(IsNullOrEmpty([DocID1]), [Document2.FirstName], [Document1.FirstName])"
UnboundType="String"/>
Такая логика должна быть реализована в классе модели или модели представления. Помните, что XAML - это только язык разметки.
Просто создайте другое свойство, которое возвращает первое совпадение и связывается с этим. Если ваши классы сущностей генерируются автоматически, вы можете создать новый частичный класс:
public partial class Event
{
public string DocName
{
get
{
if (Document1 != null)
return Document1.FirstName;
if (Document2 != null)
return Document1.LastName;
return null;
}
}
}
<dxg:GridColumn
x:Name="colFirsnName"
Width="120"
FieldName="DocName"
Header="First Name"
Visible="True"
VisibleIndex="1" IsReadOnly="true" />