将数据连接到两个类中以便在View中使用

时间:2013-02-12 16:07:24

标签: c# wpf xaml binding collections

我正在尝试将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;

        }
    }

将ViewModel设置为何处(EmailService.cs)

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

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


            ev.ViewModel.AddressProviders = this.AddressProviders;

正如您在此处所看到的,正在使用的视图是EmailView ...但是我需要使用我的窗口中组合框所在的datacontext中定义的视图。我是否需要以某种方式连接类以共享信息。如果是这样,我在世界上如何做到这一点。这可能不是问题,但它是唯一对我有意义的事情。希望你们中的一个人能在我扔掉电脑之前搞清楚。再次,任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:0)

考虑使用ObservableCollection进行绑定,如果您已将该集合设为IEnumerable,则可以轻松转换它,

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

ObservableCollection有一个构造函数,它将IEnumerable作为参数并对其进行浅层复制