EF6,代码优先。如何使用 XAML Devexpress 为 GridControl 列设置替代数据源

EF6, Code First. How to set alternative data source for GridControl column using 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));
            }
        }

我的事件列表的数据取自实体事件:

var query = DBContext.Events.Select(x => x).AsQueryable();
EventList = query.ToList();

我需要的是如何将 GridControl 列 "colFirstName" 值设置为等于 "Document1.FirstName"(如果 DocID1 不为空)和 "Document2.FirstName"(如果 DocID2 不为空)。我的 GridControl XAML 代码如下,您能否帮助如何在 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>

这种逻辑应该在模型或视图模型中实现class。请记住 XAML 只是一种 标记 语言。

只需创建另一个 属性,returns 第一个匹配并绑定到这个。如果您的实体 classes 是自动生成的,您可以创建一个新的部分 class:

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" />

您可以使用UnboundExpression property to create a column with a custom expression。例如,要有条件地显示来自不同属性的值,请使用 Iif 函数:

<dxg:GridColumn FieldName="CustomColumn" x:Name="colFirsnName" 
                UnboundExpression="Iif(IsNullOrEmpty([DocID1]), [Document2.FirstName], [Document1.FirstName])" 
                UnboundType="String"/>