我正在尝试将我的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>
那是我的组合框。我意识到这个代码是完全错误的,但我是新的,所以我试图通过反复试验来处理它。
代码:
这是我的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以便如何设置这些值,我喜欢称之为'魔术'。我没有写这个的电子邮件部分。我只是想要在组合框中获取元素。再次感谢!
答案 0 :(得分: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>
还要确保将Page的DataContext设置为ViewModel实例。
编辑:好的,只是明白您错误地设置了DataContext
。根据你所写的内容,你似乎将它设置在你的XAML中的某个地方:
DataContext="clr-namespace:Alliance.Library.Email.EmailViewModel"
这实质上意味着您将数据上下文设置为字符串,然后尝试绑定到该字符串的属性,这些属性当然不存在。我建议你检查运行时输出是否存在绑定错误,以确保是这种情况。
如果确实如此,那么您需要正确设置DataContext
。最简单的选择是在视图的构造函数中执行此操作:
public MyView()
{
DataContext = new Alliance.Library.Email.EmailViewModel();
}
答案 1 :(得分:1)
我认为这就是你想要的(在视图中)。
<ComboBox
x:Name="cboProviders"
ItemsSource="{Binding Source=AddressProviders}"
DisplayMemberPath="ProviderName"
Grid.Row="0" Grid.Column="1"></ComboBox>
MSDN上的