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" />
Другие вопросы по тегам