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"/>
我有两个相关实体:
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"/>