3

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

MessageEFによって生成されたクラス:

[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でのデータバインディングは初めてです。この問題が単純であることを願っていますが、どうすれば解決できるかわかりません。

4

1 に答える 1

5

DataContextの代わりにItemsSource、結果セットに設定します。

gridMessages.ItemsSource = result;

WPFを初めて使用する場合は、UIをビジネスロジックから分離するために、MVVMがここでのアプローチよりも優れていることに注意してください。DataContextMVVMアプローチを使用するには、ウィンドウをビューモデルクラスに設定します。

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"/>
于 2012-11-07T20:16:18.843 に答える