Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定IEnumerable的结果<;类别>;到组合框_C#_Wpf_Xaml_Data Binding_Collections - Fatal编程技术网

C# 绑定IEnumerable的结果<;类别>;到组合框

C# 绑定IEnumerable的结果<;类别>;到组合框,c#,wpf,xaml,data-binding,collections,C#,Wpf,Xaml,Data Binding,Collections,我正在尝试将ViewModel中集合的结果绑定到组合框。下面是我的代码。任何帮助都将不胜感激。如果您需要查看其他内容或需要更多信息,请告诉我 XAML: DataContext=“clr命名空间:Alliance.Library.Email.EmailViewModel” 那是我的组合框。我意识到这方面的代码是完全错误的,但我是新来的,所以我试着用试错法来处理它 代码: 这在我的VeiwModel“EmailViewModel.cs”中: public IEnumerable AddressP

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

XAML:

DataContext=“clr命名空间:Alliance.Library.Email.EmailViewModel”
那是我的组合框。我意识到这方面的代码是完全错误的,但我是新来的,所以我试着用试错法来处理它

代码:

这在我的VeiwModel“EmailViewModel.cs”中:

public IEnumerable AddressProviders{get;set;}
这是我的界面“IEMailAddressProvider”:

公共接口IEmailAddressProvider
{
字符串提供程序名{get;}
IEnumerable GetEmailUsers();
}
}
包含GetEmailUsers()的“EmailAddressProviders.cs”的代码:

[导出(类型(IEMailAddressProvider))]
公共类EmailAddressProvider:IEMailAddressProvider
{
#区域私有财产
私有静态只读EncryOptionService encryptionService=AllianceApp.Container.GetExportedValue();
#端区
公共字符串提供程序名
{
获取{返回“联盟用户”;}
}
public IEnumerable GetEmailUsers()
{
IUserRepository userRepo=AllianceApp.Container.GetExportedValue();
IEnumerable users=userRepo.GetAllUsers().Where(a=>a.IsDeleted==false).OrderBy(a=>a.UserID).AsEnumerable();
列表地址列表=新列表();
foreach(用户中的var用户)
{
if(user.DisplayName!=null&&user.EmailAddress!=null&&user.DisplayName!=string.Empty&&user.EmailAddress!=string.Empty)
address.Add(新的EmailAddress(){DisplayName=encryptionService.DecryptString(user.DisplayName),Email=encryptionService.DecryptString(user.EmailAddress)});
}
AddressList.OrderBy(u=>u.DisplayName);
返回地址列表;
}
}

我使用MEF是为了了解这些值是如何设置的,我喜欢称之为“魔术”。我没有写这篇文章的电子邮件部分。我只是试着在组合框中获取元素。再次感谢

如果您在任何地方都没有StaticResource,就不应该使用它。对于您的情况,您很可能希望执行以下操作:

GetEmailUsers()
方法更改为属性(您只能绑定属性,不能绑定方法返回值):

这本质上意味着您将数据上下文设置为一个字符串,然后尝试绑定到该字符串的属性,而该属性肯定不存在。我建议您检查运行时输出是否存在绑定错误,以确保情况属实

如果确实如此,那么您需要正确设置
DataContext
。最简单的开始选项是在视图的构造函数中执行此操作:

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

我想这就是你想要的(在视图中)



在MSDN上。

1。到底是什么不起作用?2.发布您用于绑定的StaticResource是如何定义的。它只是不包含集合,而且我还没有定义我的StaticResource。就像我说的,我对这个很陌生。我发现这并不是那么直观。我已经有一段时间没有做WPF了,但这不需要是一个ObservableCollection,而不是IEnumerable吗?@IronMan84不。observable的优势在于,如果UI添加/删除/编辑项,那么底层集合也会发生更改,如果基础集合被更新,UI也会被更新。如果您使用的是
IEnumerable
它是序列到控件的一次性副本。我将发布GetEmailUsers()的代码,以查看它是否更改了答案。谢谢你的帮助!我想显示提供者名称,而不是电子邮件用户。我已经实现了这一点,但它实际上没有显示组合框中的值。它表现得好像有什么东西在那里,但实际上没有任何文字。你知道这是什么原因吗?对我来说很有效。我需要绑定到IEnumerable(表的一列)的属性。我尝试了ItemsSource=“{Binding Source=AddressProviders.ProviderName}”,但没有成功,不知道为什么,但您的成功了。谢谢
 public IEnumerable<IEmailAddressesProvider> AddressProviders { get; set; }
    public interface IEmailAddressesProvider
    {
        string ProviderName { get; }
        IEnumerable<EmailAddress> 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;

        }
    }
public interface IEmailAddressesProvider
{
    string ProviderName { get; }
    IEnumerable<EmailAddress> EmailUsers { get; set;};
}
<ComboBox x:Name="cboProviders" ItemsSource="{Binding AddressProviders.EmailUsers}" Grid.Row="0" Grid.Column="1"></ComboBox>
DataContext="clr-namespace:Alliance.Library.Email.EmailViewModel"
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>