How to bind entities from Entity Framework to DataGrid?

ado.net data-binding entity-framework wpf

Question

Me, 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 program:

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

Sadly, nothing happens; there is nothing in the DataGrid. Data binding with WPF and EF is new to me. I'm hoping that this issue is straightforward, but I have no idea where to start.

1
3
11/7/2012 8:20:56 PM

Accepted Answer

Set DataContext as opposed toItemsSource the result collection.

gridMessages.ItemsSource = result;

Note Since you're unfamiliar with WPF, you might want to be aware that MVVM is preferable to this method for separating user interface from business logic. To employ an MVVM strategy, you would modify your Windows'DataContext regarding a 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 resembles the following:

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

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

    // TODO implement INotifyPropertyChanged
}

Bind your property to the DataGrid's ItemsSource after that.

<DataGrid ItemsSource="{Binding Messages}" Grid.Row="1"/>
5
11/7/2012 8:25:46 PM


Related Questions





Related

Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow