1

私の目標は、Datatemplateと2つのTextBlock(ユーザーメッセージテキストとユーザー名)を含むリストボックスに表示することです。

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

json応答からリストに生成および解析される2つの別個のクラスがあります。

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

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

クラスからのユーザーメッセージの横にあるUserNameクラスからxamlにバインドするにはどうすればよいですか?どちらのクラスも同じです。UserMessageUserId

もちろん、簡単な方法は、クラスに追加のプロパティUserNameを作成し、UserクラスからプロパティをMessage渡してバインドすることですが、これは繰り返しの作業であり、悪い習慣のようです。UserNameMessage

頭に浮かんだ解決策の1つは、ある種の値コンバーターを使用してから、UserIdやユーザーリストなどの追加のパラメーターを渡すことですが、それは一種のハックのようです。結果?

4

3 に答える 3

3

あなたが言及した回避策のいずれかが機能し、2つの異なるオブジェクトにバインドする方法はないと思います。その理由は、.NETデータバインディングの動作方法にあります。最初のオブジェクトを使用してプロパティを決定し、残りが続くことを期待します。

個人的には、UserとMessageを含む別のクラスを作成し、必要に応じて「転送呼び出し」を行います。もちろん、このクラスを作成するときは、IDが一致するユーザーとメッセージを必ず一緒に配置してください。

例えば、

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 に答える