2013-02-08 31 views
1

我想將ViewModel中的集合的結果綁定到組合框。以下是我的代碼。任何幫助,將不勝感激。如果您需要查看其他信息或需要更多信息,請告訴我。將IEnumerable <class>的結果綁定到組合框

XAML:

DataContext="clr-namespace:Alliance.Library.Email.EmailViewModel" 

    <ComboBox x:Name="cboProviders" ItemsSource="{Binding Source=AddressProviders}" DisplayMemberPath="ProviderName" Grid.Row="0" Grid.Column="1"></ComboBox> 

這是我的組合框。我意識到,代碼是完全錯誤的,但我是新的,所以我試圖通過試驗和錯誤來處理它。

代碼:

這是我VeiwModel 「EmailViewModel.cs」:

public IEnumerable<IEmailAddressesProvider> AddressProviders { get; set; } 

這是我的界面 「IEmailAddressesProvider」:

public interface IEmailAddressesProvider 
    { 
     string ProviderName { get; } 
     IEnumerable<EmailAddress> GetEmailUsers(); 
    } 
} 

守則 「EmailAddressProviders.cs」包含GetEmailUsers():

[Export(typeof(IEmailAddressesProvider))] 
    public class EmailAddressProvider : IEmailAddressesProvider 
    { 
     #region Private Properties 

     private static readonly IEncryptionService encryptionService = AllianceApp.Container.GetExportedValue<IEncryptionService>(); 

     #endregion 

     public string ProviderName 
     { 
      get { return "Alliance Users"; } 
     } 

     public IEnumerable<EmailAddress> GetEmailUsers() 
     { 
      IUserRepository userRepo = AllianceApp.Container.GetExportedValue<IUserRepository>(); 
      IEnumerable<User> users = userRepo.GetAllUsers().Where(a => a.IsDeleted == false).OrderBy(a => a.UserID).AsEnumerable(); 

      List<EmailAddress> AddressList = new List<EmailAddress>(); 

      foreach (var user in users) 
      { 
       if (user.DisplayName != null && user.EmailAddress != null && user.DisplayName != string.Empty && user.EmailAddress != string.Empty) 
        AddressList.Add(new EmailAddress() { DisplayName = encryptionService.DecryptString(user.DisplayName), Email = encryptionService.DecryptString(user.EmailAddress) }); 
      } 

      AddressList.OrderBy(u => u.DisplayName); 

      return AddressList; 

     } 
    } 

我正在使用MEF以便如何設置這些值,我喜歡稱之爲'魔術'。我沒有寫這個電子郵件部分。我只是在考慮獲取組合框中的元素。再次感謝!

+0

http://www.wintellect.com/cs/blogs/jlikness/archive/2010/06/10/tips-and-tricks-for-inotifypropertychanged.aspx – spender 2013-02-08 14:51:21

+0

1。什麼不工作? 2.發佈如何定義您用於綁定的StaticResource。 – Haspemulator 2013-02-08 14:51:24

+0

它只是不包含集合,我沒有定義我的StaticResource。就像我說的,我對此很新。我發現它並不那麼直觀。 – JLott 2013-02-08 14:52:28

回答

1

如果你真的沒有StaticResource任何地方,你不應該使用它。對於你的情況,你最想做到以下幾點:

變化GetEmailUsers()方法的屬性(你只能綁定的屬性,而不是方法的返回值):

public interface IEmailAddressesProvider 
{ 
    string ProviderName { get; } 
    IEnumerable<EmailAddress> EmailUsers { get; set;}; 
} 

那麼你的XAML改成這樣:

<ComboBox x:Name="cboProviders" ItemsSource="{Binding AddressProviders.EmailUsers}" Grid.Row="0" Grid.Column="1"></ComboBox> 

此外,請確保您爲您的頁面設置DataContext到您的ViewModel實例。

編輯:好的,只是明白,你錯誤地設置DataContext。基於你寫什麼,你似乎某處設置它在你的XAML這樣的:

DataContext="clr-namespace:Alliance.Library.Email.EmailViewModel" 

這基本上意味着你的數據上下文設置爲一個字符串,然後嘗試綁定到該字符串的屬性,這當然不存在。我建議你檢查你的運行時輸出是否有綁定錯誤,以確保是這種情況。

如果確實如此,那麼您需要正確設置DataContext。最簡單的選擇是在視圖的構造函數中執行此操作:

public MyView() 
{ 
    DataContext = new Alliance.Library.Email.EmailViewModel(); 
} 
+0

我將發佈GetEmailUsers()的代碼以查看它是否更改了答案。感謝您的幫助! – JLott 2013-02-08 15:10:28

+0

此外,接口不能包含字段... – JLott 2013-02-08 16:42:42

+0

當然,我的意思是財產,當然。 – Haspemulator 2013-02-08 20:05:59

1

我認爲這是您想要的(在視圖中)。

<ComboBox 
    x:Name="cboProviders" 
    ItemsSource="{Binding Source=AddressProviders}" 
    DisplayMemberPath="ProviderName" 
    Grid.Row="0" Grid.Column="1"></ComboBox> 

DisplayMemberPath MSDN上。

+0

我已經實現了這一點,但它並沒有實際顯示ComboBox中的值。它的行爲就像是在那裏,但實際上沒有任何文字。你知道可能會導致這種情況嗎? – JLott 2013-02-11 15:04:30

+0

在我的情況下工作。我需要綁定到IEnumerable的屬性(表的一列)。我試過ItemsSource =「{綁定源= AddressProviders.ProviderName}」,但沒有工作,不知道爲什麼,但你的。謝謝! – usefulBee 2014-09-30 18:06:36