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;

        }
    }

ViewModel(EmailService.cs)に設定されている場所

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

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


            ev.ViewModel.AddressProviders = this.AddressProviders;

ここでわかるように、使用されているビューはEmailViewです...ただし、コンボボックスがあるウィンドウのデータコンテキストで定義されているビューを使用する必要があります。情報を共有するために、どういうわけかクラスを接続する必要がありますか?もしそうなら、私は世界でどのようにそれをしますか。これは問題ではないかもしれませんが、私にとって理にかなっているのはそれだけです。私がコンピューターを投げる前に、あなたの一人がそれを理解できることを願っています。繰り返しになりますが、どんな助けでもありがたいです。

4

1 に答える 1

0

バインディングにObservableCollectionを使用することを検討してください。コレクションが既にあるIEnumerable場合は、簡単に変換できます。

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

ObservableCollectionパラメータとしてを取り、そのIEnumerable浅いコピーを作成するコンストラクタがあります

于 2013-02-12T16:19:26.217 に答える