1

クラスContactsと彼のSearchAsyncメソッドを使用せずに連絡先を取得することは可能ですか? 私は自分の問題を説明します。

ObservableCollection があります

private ObservableCollection<ContactPictureItemModel> _ContactPictures;

このような ContactPictureItemModel であること

public class ContactPictureItemModel
{
    private string _Email;
    private byte[] _Picture;
    private string _DisplayName;

    public ContactPictureItemModel(string email, byte[] picture, string displayName)
    {
        this._Email = email;
        this._Picture = picture;
        this._DisplayName = displayName;
    }

    public string Email
    {
        get { return _Email; }
        set { _Email = value; }
    }

    public byte[] Picture
    {
        get { return _Picture; }
        set { _Picture = value; }
    }

    public string DisplayName
    {
        get { return _DisplayName; }
        set { _DisplayName = value; }
    }
}

この ObservableCollection のすべてのオブジェクトは、ユーザーが EmailAddressChooserTask から連絡先を選択するたびに、アプリケーションが「キャッシュ」した連絡先の写真を表します。

このメソッドを呼び出すときに必要です

public ContactPictureItemModel GetContactPictureItem(string email, string displayName)
{
    ContactPictureItemModel contactPictureResult;

    foreach (ContactPictureItemModel contact in ContactPictures)
    {
        if (email.Equals(contact.Key))
        {
            contactPictureResult = contact;
            break;
        }
    }

    if (contactPictureResult == null)
    {
        //Retrieve contact using "email" parameter
    }

    return contactPictureResult;
}

非同期タスクを使用せずにパラメーター「email」と「displayName」を使用して連絡先を取得できるように、ObservableCollection に連絡先が見つかりません。ContactPictureItemModel オブジェクトを取得する関数が必要です。

それは可能ですか?

ありがとう!

4

2 に答える 2

0

Richard Szalayのおかげで、私は解決策を見つけました。これらの質問で私のように立ち往生しているすべての人を助けるためにそれを説明するつもりです(Java表記については申し訳ありませんが、コードはこのように短くなっています)

これらは、連絡先と彼の写真を表すオブジェクトを持つプライベートフィールドです。

public class ParticipantItemModel {
    private string _Email;
    private string _DisplayName;
    private bool _Paid;
    [XmlIgnore]
    private BitmapImage _ContactPicture;

    [...]
}

すべてのプライベートフィールドには、彼の価値を取得および設定するための独自のプロパティがあります。このように

    public string Email {
        get { return _Email; }
        set { _Email = value; }
    }

_ContactPictureを扱う場合、そのプロパティは少し特別です。その値を取得するために、_ContactPictureがnullで、画像がObservableCollectionにキャッシュされていない場合、Contacts.SearchAsyncタスクを使用して連絡先を検索し、「空の画像」を返します。連絡先が見つかったら(ビューが既に読み込まれているにもかかわらず)、プロパティContactPictureに正しい画像を設定し、PropertyChangedEventArgsイベントを発生させます(setterプロパティで確認できます)。

    [XmlIgnore]
    public BitmapImage ContactPicture
    {
        get {
            if (_ContactPicture != null) {
                return _ContactPicture;
            } else {
                BitmapImage contactPictureSource = App.ContactPictures.GetContactPicture(Email, DisplayName);

                if (contactPictureSource != null) {
                    return contactPictureSource;
                } else {
                    Contacts contacts = new Contacts();
                    contacts.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(contacts_SearchCompleted);
                    contacts.SearchAsync(DisplayName, FilterKind.DisplayName, Email);

                    return new BitmapImage();
                }
            }
        }

        set {
            _ContactPicture = value;
            //When _ContactPicture is setted, an event is raised by calling to NotifyPropertyChanged()
            NotifyPropertyChanged("ContactPicture");
        }
    }

    void contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) {
        Contact contact = null;

        foreach (var result in e.Results) {
            foreach (ContactEmailAddress contactEmail in result.EmailAddresses) {
                if (Email.Equals(contactEmail.EmailAddress)) {
                    contact = result;
                    this.ContactPicture = GetSourceImageFromContactPicture(contact.GetPicture());
                    break;
                }
            }
        }
    }        
}

また、イベントPropertyChangedEventArgsを発生させるには、INotifyPropertyChangedインターフェイスを実装する必要があります。このイベントにより、アプリケーションは要素(連絡先の写真)が変更されたことを認識し、バインドされたデータを使用して更新されます。

public class ParticipantItemModel : INotifyPropertyChanged {

    [...]

    // Declare the PropertyChanged event
    public event PropertyChangedEventHandler PropertyChanged;

    // NotifyPropertyChanged will raise the PropertyChanged event passing the
    // source property that is being updated.
    public void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

その結果、連絡先は画像なしで表示されますが、ほとんど自動的に画像が読み込まれます。

お役に立てば幸いです

于 2012-09-25T20:58:42.727 に答える
0

API がないため、連絡先に同期的にアクセスすることはできません。

ビュー モデルを "読み込み中" の状態で作成し、非同期メソッドが完了したときに "入力" することができます。モデルクラスが実装していることを確認してくださいINotifyPropertyChanged

于 2012-09-24T21:27:25.193 に答える