绑定IEnumerable<;类>;到combobox

本文关键字:combobox gt lt 绑定 IEnumerable | 更新日期: 2023-09-27 17:58:16

我正在尝试将ViewModel中集合的结果绑定到组合框。下面是我的代码。如有任何帮助,我们将不胜感激。如果您需要查看其他内容或需要更多信息,请告诉我。

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>

那是我的combobox。我意识到这个代码是完全错误的,但我是新来的,所以我试着反复尝试。

代码:

这是在我的VeiwModel"EmailViewModel.cs"中:

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

这是我的界面"IEmailAddressesProvider":

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

包含GetEmailUsers()的"EmailAddressProviders.cs"的代码:

[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是为了了解这些值是如何设置的,我喜欢称之为"魔术"我没有写这封信的电子邮件部分。我只是想把元素放在组合框里。再次感谢!

绑定IEnumerable<;类>;到combobox

如果你在任何地方都没有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();
}

我认为这就是您想要的(在视图中)。

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

MSDN上的DisplayMemberPath。