【问题标题】:EF6, Code First. How to set alternative data source for GridControl column using XAML DevexpressEF6,代码优先。如何使用 XAML Devexpress 为 GridControl 列设置替代数据源
【发布时间】:2017-06-08 08:01:01
【问题描述】:

我有两个相关的实体:

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 的数据取自实体 Event:

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>

【问题讨论】:

    标签: wpf xaml entity-framework-6 devexpress dxgrid


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      这种逻辑应该在模型或视图模型类中实现。请记住,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" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 1970-01-01
        • 2021-05-30
        • 2014-04-20
        • 1970-01-01
        相关资源
        最近更新 更多