2012-10-04 41 views
1

我的目標是在ListBox中顯示Datatemplate和兩個TextBlocks:用戶消息文本和用戶名。Windows phone綁定來自兩個獨立類的數據

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

我怎麼可能在XAML UserName結合來自User類從Message類旁邊的用戶信息?這兩個類都有UserId,這是相同的。

當然,簡單的方法去Message類將創造更多的財產UserName,然後通過從用戶類UserName財產爲Message然後將它綁定,但似乎重複的任務和壞的做法。

想到的一個解決方案是使用某種類型的值轉換器,然後傳遞額外的參數,如UserId和用戶列表,但這似乎有點hackish ..所以我想知道是否有某種linq,sql樣式實現以獲得我想要的結果?

回答

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

感謝,它適用於我現在:)與linq我可以從Json.net JObject查詢並直接傳遞屬性到Message類。 – janiss

3

您提到的任何一種解決方法都能正常工作,而且我認爲無論如何綁定到兩個不同的對象。原因在於.NET數據綁定的工作方式。它使用第一個對象來確定屬性,然後期待其餘的依照。

就我個人而言,我會創建另一個類,其中包含用戶和消息,然後在需要時「轉發呼叫」。顯然,當你創建這個類時,你一定要把用戶和消息與匹配的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

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> 

我希望它有幫助。