1

我有两个相关的实体:

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; }

}

还创建了 List 以在 WPF 中显示数据:

private ObservableCollection<Event> eventList;
public ObservableCollection<Event> EventList
        {
            get { return eventList; }
            set
            {
                if (value != eventList)
                {
                    eventList = value;
                }
                RaisePropertyChanged(nameof(EventList));
            }
        }

我的 EventList 的数据取自实体事件:

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

我需要的是如果 DocID1 不为空,如何将 GridControl 列“colFirstName”值设置为等于“Document1.FirstName”,如果 DocID2 不为空,如何设置“Document2.FirstName”。我的 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>
4

2 回答 2

1

这种逻辑应该在模型或视图模型类中实现。请记住,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" />
于 2017-06-08T10:01:34.450 回答
1

您可以使用UnboundExpression属性创建具有自定义表达式的列。例如,要有条件地显示来自不同属性的值,请使用Iif函数:

<dxg:GridColumn FieldName="CustomColumn" x:Name="colFirsnName" 
                UnboundExpression="Iif(IsNullOrEmpty([DocID1]), [Document2.FirstName], [Document1.FirstName])" 
                UnboundType="String"/>
于 2017-06-08T14:19:43.880 回答