如何将实体从Entity Framework绑定到DataGrid?

时间:2012-11-07 20:05:22

标签: wpf entity-framework data-binding ado.net

我的XAML:

<Window x:Class="Newsletter.UI.MessagesWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MessagesWindow" Name="messagesWindow" Height="576" Width="1024" WindowStartupLocation="CenterScreen" Closed="MessagesWindowClosed">
    <Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Width" Value="149"/>
            <Setter Property="Margin" Value="10"/>
        </Style>
    </Window.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="75"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0"  Orientation="Horizontal" HorizontalAlignment="Center">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Button Name="saveButton" Grid.Row="0" Content="Save"  Margin="10,10,10,5"/>
                <TextBox Name="searchTextBox" Grid.Row="1"  Margin="10,5,10,10"/>
            </Grid>
            <Button Name="recipientsButton" Content="RECIPIENTS" Click="RecipientsButtonClick" />
            <Button Name="createButton" Content="CREATE" Click="CreateButtonClick" />
            <Button Name="removeButton" Content="REMOVE" />
            <Button Name="editButton" Content="EDIT" />
            <Button Name="resendButton" Content="RESEND"/>
        </StackPanel>
        <DataGrid Name="gridMessages" Grid.Row="1"/>
    </Grid>
</Window>

我的.cs代码:

private void messagesWindow_Loaded(object sender, RoutedEventArgs e)
        {
            using (NewsletterEntities context = new NewsletterEntities())
            {
                var query = from m in context.Messages select m;
                var result = query.ToList();
                gridMessages.DataContext = result;
            }
        }
EF生成的

Message类:

[EdmEntityTypeAttribute(NamespaceName="NewsletterModel", Name="Message")]
[Serializable()]
[DataContractAttribute(IsReference=true)]
public partial class Message : EntityObject
{
    #region Factory Method

/// <summary>
/// Create a new Message object.
/// </summary>
/// <param name="messageID">Initial value of the MessageID property.</param>
/// <param name="subject">Initial value of the Subject property.</param>
/// <param name="content">Initial value of the Content property.</param>
/// <param name="hasAttachments">Initial value of the HasAttachments property.</param>
/// <param name="senderID">Initial value of the SenderID property.</param>
/// <param name="date">Initial value of the Date property.</param>
public static Message CreateMessage(global::System.Int32 messageID, global::System.String subject, global::System.String content, global::System.Boolean hasAttachments, global::System.Int32 senderID, global::System.DateTime date)
{
    Message message = new Message();
    message.MessageID = messageID;
    message.Subject = subject;
    message.Content = content;
    message.HasAttachments = hasAttachments;
    message.SenderID = senderID;
    message.Date = date;
    return message;
}

#endregion

#region Primitive Properties

/// <summary>
/// No Metadata Documentation available.
/// </summary>
[EdmScalarPropertyAttribute(EntityKeyProperty=true, IsNullable=false)]
[DataMemberAttribute()]
public global::System.Int32 MessageID
{
    get
    {
        return _MessageID;
    }
    set
    {
        if (_MessageID != value)
        {
            OnMessageIDChanging(value);
            ReportPropertyChanging("MessageID");
            _MessageID = StructuralObject.SetValidValue(value);
            ReportPropertyChanged("MessageID");
            OnMessageIDChanged();
        }
    }
}
private global::System.Int32 _MessageID;
partial void OnMessageIDChanging(global::System.Int32 value);
partial void OnMessageIDChanged()

不幸的是没有任何事情发生,DataGrid是空的。 我是WPF和EF中数据绑定的新手。我希望这个问题很简单但我不知道如何解决它。

1 个答案:

答案 0 :(得分:5)

而不是DataContext,将ItemsSource设置为结果集。

gridMessages.ItemsSource = result;

注意由于您不熟悉WPF,您可能需要注意MVVM优于此处的方法,用于将UI与业务逻辑分离。要使用MVVM方法,您需要将Window的DataContext设置为某些View Model类:

private void messagesWindow_Loaded(object sender, RoutedEventArgs e) 
{ 
    Model = new ViewModel();
    this.DataContext = Model;
    // TODO set Model.Messages to the EF result set
}

ViewModel看起来像这样:

public class ViewModel : INotifyPropertyChanged
{
    private List<Message> _messages;

    public List<Message> Messages
    {
        get { return _messages; }
        set
        {
            _messages = value;
            RaisePropertyChanged("Messages");
        }
    }

    // TODO implement INotifyPropertyChanged
}

然后将DataGrid的ItemsSource绑定到您的属性。

<DataGrid ItemsSource="{Binding Messages}" Grid.Row="1"/>