1

我的目标是在带有 Datatemplate 和两个 TextBlocks 的 ListBox 中显示:用户消息文本和用户名。

<ListBox.ItemTemplate>
  <DataTemplate>
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding MessageText}"/>
      <TextBlock Text="{Binding UserName}"/>
    </StackPanel>
  </DataTemplate>
</ListBox.ItemTemplate>

我有两个单独的类从 json 响应生成并解析为列表:

Message
{
   int MessageID;
   string MessageText;
   int UserID;
}
User
{
   int UserID;
   string UserName;
}

List<Message> Messages;
List<User> Users;

如何在类中的用户消息旁边的UserName类中绑定 xaml ?两个类都有相同的。UserMessageUserId

当然,最简单的方法是UserNameMessage类中创建附加属性,然后将UserName属性从 User 类传递到Message然后绑定它,但这似乎是重复性任务和不好的做法。

想到的一种解决方案是使用某种值转换器,然后传递其他参数,例如UserId和用户列表,但这似乎有点骇人听闻。所以我想知道是否有某种 linq、sql 风格的实现来获得我想要的结果?

4

3 回答 3

3

您提到的任何一种解决方法都可以使用,我认为无论如何都不会绑定到两个不同的对象。原因在于 .NET 数据绑定的工作方式。它使用第一个对象来确定属性,然后期望其余的对象跟随。

就个人而言,我会创建另一个包含用户和消息的类,然后在需要时“转接呼叫”。显然,当您创建此类时,请确保将具有匹配 ID 的 User 和 Message 放在一起。

例如,

class Chat
    {
        private User user;

        private Message message;

        public string UserName
        {
            get
            {
                return user.Username;
            }
        }

        public string MessageText
        {
            get
            {
                return message.MessageText;
            }
        }
    }

参考:community.devexpress

于 2012-10-04T15:26:33.763 回答
0

这应该可以帮助您:

   Message mess = null; 

   var item = from user in Users
              where (mess = Messages.First(m => m.UserID == user.UserID)) != null
              select new {user.UserName, mess.MessageText};
于 2012-10-04T23:55:04.533 回答
0

使用您的预定义类,您也可以这样做。

public class DisplayBox
{
    public User user{get;set}

    public Message message{get;set;}
}

现在创建一个public List<DisplayBox> list = new List();

并向其中添加项目。

   list.Add(new DisplayBox()
   {
        user = new User(){UserName=""}, message = new Message(){Message=""}
   });

现在将您的列表框绑定到此列表。

 <ListBox ItemSource={Binding list}
  <ListBox.ItemTemplate>
    <DataTemplate>
      <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding message.MessageText}"/>
        <TextBlock Text="{Binding user.UserName}"/>
      </StackPanel>
    </DataTemplate>
  </ListBox.ItemTemplate>
 </ListBox>

我希望它有所帮助。

于 2012-10-05T03:52:23.793 回答