2013-02-12 21 views
0

我正試圖將IEnumberable集合綁定到組合框。我知道問題是我在哪裏實例化我的ViewModel ...我的視圖的datacontext是一個完全不同的實例,並沒有看到正在設置的數據。我需要知道我需要如何將數據傳遞給正確的實例。我是WPF的新手,所以我可能不會解釋一些完全正確的東西。以下是我認爲相關的代碼。如果您想查看其他內容,請告訴我,我會盡我所能提供信息。任何幫助,將不勝感激!我也會一直接受提示和技巧!在兩個類中連接數據以用於視圖

代碼:

XAML:

<telerik:RadComboBox x:Name="cboProviders" ItemsSource="{Binding Source=AddressProviders}" DisplayMemberPath="ProviderName" SelectedItem="{Binding SelectedAddressProvider, Mode=TwoWay}" Grid.Row="0" Grid.Column="1"/> 

上面就是我目前使用的綁定。它知道那裏有一個集合,但它不顯示正在設置的數據。

的DataContext:

public EmailAddressWindow() 
     { 
      InitializeComponent(); 
      this.DataContext = new EmailViewModel(); 

     } 

這被設置爲EmailViewModel

EmailViewModel:

public IEnumerable<IEmailAddressesProvider> AddressProviders 
    { 
     get 
     { 
      return _AddressProviders; 
     } 
     set 
     { 
      _AddressProviders = value; 
      OnPropertyChanged("AddressProviders"); 
     } 
    } 
private string _SelectedAddressProvider; 
public string SelectedAddressProvider 
{ 
    get 
    { 
     return _SelectedAddressProvider; 
    } 
    set 
    { 
     _SelectedAddressProvider = value; 
     OnPropertyChanged("SelectedAddressProvider"); 
    } 
} 

接口(IEmailAddressesProvider):

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

凡的ProviderName設置和定義方法EmailUsers(EmailAddressesProvider):

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

     } 
    } 

凡被設置爲視圖模型(EmailService.cs)

[ImportMany] 
     public IEnumerable<IEmailAddressesProvider> AddressProviders { get; set; } 

EmailView ev = AllianceApp.Container.GetExportedValue<EmailView>(); 


      ev.ViewModel.AddressProviders = this.AddressProviders; 

正如你所看到的,所使用的視圖是EmailView ...但是我需要使用在我的窗口的datacontext中定義的組合框所在的視圖。我是否需要以某種方式連接類以共享信息。如果是這樣,我該怎麼做。這可能不是問題,但它是唯一對我有意義的事情。希望你們中的一個能夠在我扔掉我的電腦之前弄清楚它。再次,任何幫助表示讚賞。

+1

扔東西就是爲什麼我在工作時買我自己的無線鼠標和鍵盤...... – EtherDragon 2013-02-12 17:18:03

+0

哈!我有一天竟然弄壞了我的老鼠。在旅途中學習的樂趣。 – JLott 2013-02-12 17:19:05

回答

0

考慮使用ObservableCollection綁定,如果你已經擁有的集合作爲IEnumerable您可以輕鬆地將其轉換,

ObservableCollection<T> obsColl = new ObservableCollection<T>(originalIEnumerable) 

ObservableCollection有一個構造函數的IEnumerable作爲參數,並使得它的一個淺拷貝

+0

他們真的很喜歡在這裏使用IEnumerable出於某種原因...所以我需要儘可能保持這種方式。 – JLott 2013-02-12 16:26:39

+0

@JLott看看更新的答案 – 2013-02-12 16:37:16

+0

你能解釋一下這將如何解決我的問題嗎?我必須使用從另一個View導出的值,這就是爲什麼我的數據沒有顯示出來 – JLott 2013-02-12 16:50:19