pmichna
pmichna

Reputation: 4888

How to bind entities from Entity Framework to DataGrid?

My 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>

My .cs code:

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

Message class generated by EF:

[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()

Unfortunately nothing happens, the DataGrid is empty. I'm new to data binding in WPF and EF. I hope this problem is simple but I have no idea how to solve it.

Upvotes: 3

Views: 11817

Answers (1)

McGarnagle
McGarnagle

Reputation: 102783

Instead of DataContext, set ItemsSource to the result set.

gridMessages.ItemsSource = result;

Note Since you're new to WPF, you might want to note that MVVM is better than the approach here, for separating UI from business logic. To use an MVVM approach, you'd set your Window's DataContext to some View Model class:

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

Where the ViewModel looks something like this:

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

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

    // TODO implement INotifyPropertyChanged
}

Then bind the DataGrid's ItemsSource to your a property.

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

Upvotes: 5

Related Questions