Xamarin.Mac'te veri bağlama ve anahtar-değer kodlama

Bu makale, Xcode'un veri kaynağında kullanıcı arabirimi öğelerine veri bağlamaya olanak vermek için anahtar-değer kodlama ve anahtar-değer gözlemleme Interface Builder.

Genel Bakış

Bir Xamarin.Mac uygulamasında C# ve .NET ile çalışırken, ve Xcode'da çalışan bir geliştiricinin sahip olduğu anahtar-değer kodlama ve veri bağlama tekniklerine Objective-C erişebilirsiniz. Objective-C Xamarin.Mac doğrudan Xcode ile tümleşik olduğundan, kod yazmak yerine Xcode'un Interface Builder ui öğeleriyle Veri Bağlama'ya kullanabilirsiniz.

Xamarin.Mac uygulamanıza anahtar-değer kodlama ve veri bağlama tekniklerini kullanarak kullanıcı arabirimi öğelerini doldurmak ve bu öğelerle çalışmak için yazmanız ve sürdürmeniz gereken kod miktarını önemli ölçüde azaltabilirsiniz. Ayrıca, arka uç verilerinizi(Veri Modeli ) ön uç Kullanıcı Arabirimi (Model-View-Controller)daha kolay ve daha esnek bir uygulama tasarımına neden olacak şekilde daha fazla şekilde aynabileceksiniz.

Çalışan uygulamaya örnek Çalışan

Bu makalede, bir Xamarin.Mac uygulamasında anahtar-değer kodlama ve veri bağlama ile çalışmayla ilgili temel bilgileri üzerinde çalışabilirsiniz. Öncelikle Hello, Mac makalesi, özellikle de Xcode'a giriş ve Interface Builder ve Çıkışlar ve Eylemler bölümlerine bakarak bu makalede kullanacaklarımız temel kavramları ve teknikleri gözden geçirin.

Exposing C# classes / methods to Objective-CExposing C# classes / methods to Objective-C belgesinin C# sınıflarınızı nesnelere ve kullanıcı arabirimi öğelerine kablolamak için kullanılan ve özniteliklerini de açıklayan bölümüne göz RegisterExportObjective-C atabilirsiniz.

Anahtar-değer kodlaması nedir?

Anahtar-değer kodlaması (KVC), örnek değişkenleri veya erişimci yöntemleri ( ) aracılığıyla erişmek yerine özellikleri tanımlamak için anahtarları (özel olarak biçimlendirilmiş dizeler) kullanarak nesnenin özelliklerine dolaylı olarak erişmeye yönelik bir get/set mekanizmadır. Xamarin.Mac uygulamanıza anahtar-değer kodlama uyumlu erişimcileri uygulayarak, anahtar-değer gözlemleme (KVO), veri bağlama, Çekirdek Veri, Cocoa bağlamaları ve betiklenebilirlik gibi diğer macOS (eski adıyla OS X) özelliklerine erişebilirsiniz.

Xamarin.Mac uygulamanıza anahtar-değer kodlama ve veri bağlama tekniklerini kullanarak kullanıcı arabirimi öğelerini doldurmak ve bu öğelerle çalışmak için yazmanız ve sürdürmeniz gereken kod miktarını önemli ölçüde azaltabilirsiniz. Ayrıca, arka uç verilerinizi(Veri Modeli ) ön uç Kullanıcı Arabirimi (Model-View-Controller)daha kolay ve daha esnek bir uygulama tasarımına neden olacak şekilde daha fazla şekilde aynabileceksiniz.

Örneğin, KVC uyumlu bir nesnenin aşağıdaki sınıf tanımına bakalım:

using System;
using Foundation;

namespace MacDatabinding
{
    [Register("PersonModel")]
    public class PersonModel : NSObject
    {
        private string _name = "";

        [Export("Name")]
        public string Name {
            get { return _name; }
            set {
                WillChangeValue ("Name");
                _name = value;
                DidChangeValue ("Name");
            }
        }

        public PersonModel ()
        {
        }
    }
}

İlk [Register("PersonModel")] olarak, özniteliği sınıfını kaydeden ve bunu 'de ortaya Objective-C çıkarır. Ardından, sınıfının 'den devralması gerekir (veya sınıfından devralan bir alt NSObject sınıf), bu, sınıfın KVC uyumlu olmasına olanak sağlayan NSObject birkaç temel yöntem ekler. Ardından, özniteliği özelliğini açığa çıkarır ve daha sonra KVC ve KVO teknikleri aracılığıyla özelliğe erişmek için kullanılacak [Export("Name")]Name Anahtar değerini tanımlar.

Son olarak, özelliğin Key-Value gözlemlenen değişikliklere sahip olmak için erişimcinin ve yöntem çağrılarında (özniteliğiyle aynı Anahtarı belirterek) değişiklikleri değerine kaydırması WillChangeValueDidChangeValueExport gerekir. Örnek:

set {
    WillChangeValue ("Name");
    _name = value;
    DidChangeValue ("Name");
}

Bu adım, Xcode'un veri bağlama Interface Builder çok önemlidir (bu makalenin devamlarında göreceğiz).

Daha fazla bilgi için bkz. Apple'ın Anahtar-Değer Kodlama Programlama Kılavuzu.

Anahtarlar ve anahtar yolları

Anahtar, bir nesnenin belirli bir özelliğini tanımlayan bir dizedir. Genellikle anahtar, anahtar-değer kodlama uyumlu bir nesnede erişimci yönteminin adına karşılık gelir. Anahtarlar ASCII kodlaması kullanılmalıdır, genellikle küçük harfle başlar ve boşluk içermez. Bu nedenle yukarıdaki Name örnekte, sınıfının özelliğinin Anahtar Name Değeri PersonModel olabilir. Anahtar ve açığa çıkardırma özelliğin adı aynı olmak zorunda değildir, ancak çoğu durumda aynı olması gerekir.

Anahtar Yolu, çapraz geçiş yapmak için nesne özelliklerinin hiyerarşisini belirtmek için kullanılan noktayla ayrılmış Anahtarlar dizesidir. Dizide ilk anahtarın özelliği alıcıya göredir ve izleyen her anahtar önceki özelliğin değerine göre değerlendirilir. Bir C# sınıfındaki bir nesneyi ve özelliklerini çapraz geçiş yapmak için nokta kullanımının aynı şekilde.

Örneğin, sınıfını genişlettiy PersonModel ve özelliğini Child eklediysiniz:

using System;
using Foundation;

namespace MacDatabinding
{
    [Register("PersonModel")]
    public class PersonModel : NSObject
    {
        private string _name = "";
        private PersonModel _child = new PersonModel();

        [Export("Name")]
        public string Name {
            get { return _name; }
            set {
                WillChangeValue ("Name");
                _name = value;
                DidChangeValue ("Name");
            }
        }

        [Export("Child")]
        public PersonModel Child {
            get { return _child; }
            set {
                WillChangeValue ("Child");
                _child = value;
                DidChangeValue ("Child");
            }
        }

        public PersonModel ()
        {
        }
    }
}

Alt adın Anahtar Yolu veya yalnızca (Anahtar Değerinin nasıl kullanıldıklarına self.Child.NameChild.Name bağlı olarak) olabilir.

Anahtar-değer kodlama kullanarak değerleri alma

yöntemi, isteği alan KVC sınıfının örneğine göre belirtilen Anahtar ValueForKeyNSString (olarak) değerini döndürür. Örneğin, yukarıda Person tanımlanan sınıfın bir örneği PersonModel ise:

// Read value
var name = Person.ValueForKey (new NSString("Name"));

Bu, bu örneğinin Name özelliğinin değerini PersonModel verir.

Anahtar-değer kodlama kullanarak değerleri ayarlama

Benzer şekilde, belirtilen Anahtarın değerini (olarak), isteği alan KVC sınıfının SetValueForKeyNSString örneğine göre ayarlayın. Bu nedenle yine aşağıda gösterildiği gibi PersonModel sınıfının bir örneğini kullanın:

// Write value
Person.SetValueForKey(new NSString("Jane Doe"), new NSString("Name"));

özelliğinin değerini Name olarak Jane Doe değiştirir.

Değer değişikliklerini gözlemle

Anahtar-değer gözlemleyi (KVO) kullanarak, KVC uyumlu bir sınıfın belirli bir Anahtarına gözlemci iliştirebilirsiniz ve bu Anahtarın değeri her değiştirildiğinde (KVC teknikleri kullanılarak veya C# kodunda verilen özellığa doğrudan erişildiğinde) size bildirebilirsiniz. Örnek:

// Watch for the name value changing
Person.AddObserver ("Name", NSKeyValueObservingOptions.New, (sender) => {
    // Inform caller of selection change
    Console.WriteLine("New Name: {0}", Person.Name)
});

Şimdi, sınıfının Name örneğinin Person özelliği her PersonModel değiştirildiğinde, yeni değer konsola yazılır.

Daha fazla bilgi için bkz. Apple'ın Key-Value ProgramlamaYa Giriş Kılavuzu.

Veri bağlama

Aşağıdaki bölümlerde, C# kodu kullanarak değerleri okumak ve yazmak yerine, Xcode'un Interface Builder'sinde kullanıcı arabirimi öğelerine veri bağlamak için uyumlu sınıf gözlemleyen bir anahtar-değer kodlama ve anahtar-değer kullanma adımları yer alanmaktadır. Bu şekilde, Veri Modelinizi bunları görüntülemek için kullanılan görünümlerden ayırarak Xamarin.Mac uygulamasını daha esnek ve bakımı daha kolay hale getirirsiniz. Ayrıca yazıldığı kod miktarını da büyük ölçüde azaltabilirsiniz.

Veri modelinizi tanımlama

Interface Builder'de bir kullanıcı arabirimi öğesini Veri Bağlamadan önce, bağlama için Veri Modeli olarak hareket etmek için Xamarin.Mac uygulamanıza tanımlanmış bir KVC/KVO uyumlu sınıfına sahipsiniz. Veri Modeli, kullanıcı arabiriminde görüntülenecek tüm verileri Kullanıcı Arabirimi ve kullanıcı arabiriminde uygulamayı çalıştırırken kullanıcı arabiriminde aldığı verilerde yapılan değişiklikleri alır.

Örneğin, bir çalışan grubunu yöneten bir uygulama yazıyorsanız, Veri Modelini tanımlamak için aşağıdaki sınıfı kullanabilirsiniz:

using System;
using Foundation;
using AppKit;

namespace MacDatabinding
{
    [Register("PersonModel")]
    public class PersonModel : NSObject
    {
        #region Private Variables
        private string _name = "";
        private string _occupation = "";
        private bool _isManager = false;
        private NSMutableArray _people = new NSMutableArray();
        #endregion

        #region Computed Properties
        [Export("Name")]
        public string Name {
            get { return _name; }
            set {
                WillChangeValue ("Name");
                _name = value;
                DidChangeValue ("Name");
            }
        }

        [Export("Occupation")]
        public string Occupation {
            get { return _occupation; }
            set {
                WillChangeValue ("Occupation");
                _occupation = value;
                DidChangeValue ("Occupation");
            }
        }

        [Export("isManager")]
        public bool isManager {
            get { return _isManager; }
            set {
                WillChangeValue ("isManager");
                WillChangeValue ("Icon");
                _isManager = value;
                DidChangeValue ("isManager");
                DidChangeValue ("Icon");
            }
        }

        [Export("isEmployee")]
        public bool isEmployee {
            get { return (NumberOfEmployees == 0); }
        }

        [Export("Icon")]
        public NSImage Icon {
            get {
                if (isManager) {
                    return NSImage.ImageNamed ("group.png");
                } else {
                    return NSImage.ImageNamed ("user.png");
                }
            }
        }

        [Export("personModelArray")]
        public NSArray People {
            get { return _people; }
        }

        [Export("NumberOfEmployees")]
        public nint NumberOfEmployees {
            get { return (nint)_people.Count; }
        }
        #endregion

        #region Constructors
        public PersonModel ()
        {
        }

        public PersonModel (string name, string occupation)
        {
            // Initialize
            this.Name = name;
            this.Occupation = occupation;
        }

        public PersonModel (string name, string occupation, bool manager)
        {
            // Initialize
            this.Name = name;
            this.Occupation = occupation;
            this.isManager = manager;
        }
        #endregion

        #region Array Controller Methods
        [Export("addObject:")]
        public void AddPerson(PersonModel person) {
            WillChangeValue ("personModelArray");
            isManager = true;
            _people.Add (person);
            DidChangeValue ("personModelArray");
        }

        [Export("insertObject:inPersonModelArrayAtIndex:")]
        public void InsertPerson(PersonModel person, nint index) {
            WillChangeValue ("personModelArray");
            _people.Insert (person, index);
            DidChangeValue ("personModelArray");
        }

        [Export("removeObjectFromPersonModelArrayAtIndex:")]
        public void RemovePerson(nint index) {
            WillChangeValue ("personModelArray");
            _people.RemoveObject (index);
            DidChangeValue ("personModelArray");
        }

        [Export("setPersonModelArray:")]
        public void SetPeople(NSMutableArray array) {
            WillChangeValue ("personModelArray");
            _people = array;
            DidChangeValue ("personModelArray");
        }
        #endregion
    }
}

Bu sınıfın özelliklerinin çoğu, yukarıdaki Anahtar-değer kodlama nedir bölümünde açıklanmıştır. Ancak, bu sınıfın Dizi Denetleyicileri ve Ağaç Denetleyicileri için Bir Veri Modeli olarak davranmasına izin vermek için yapılan birkaç belirli öğeye ve bazı eklemelere göz atacağız (daha sonra Veri Bağlama Ağaç Görünümlerini, Ana Hat Görünümlerini ve Koleksiyon Görünümlerini kullanacağız).

İlk olarak, bir çalışan yönetici olabileceği için, yönetilen çalışanların onlara bağlı olmasına izin vermek için bir (özellikle de değerlerin değiştirilsin NSArrayNSMutableArray diye) kullandık:

private NSMutableArray _people = new NSMutableArray();
...

[Export("personModelArray")]
public NSArray People {
    get { return _people; }
}

Burada dikkat etmek gereken iki şey vardır:

  1. Tablo Görünümleri, Ana Hat Görünümleri ve Koleksiyonlar gibi AppKit denetimlerine Veri Bağlama gereksinimi olduğu için standart bir C# dizisi veya koleksiyonu yerine NSMutableArraybir kullandık.NSMutableArray
  2. Çalışan dizisini veri bağlama amacıyla bir türüne değiştirerek ve C# biçimlendirilmiş adını NSArray { PeoplepersonModelArrayNSArray biçiminde veri bağlamanın beklediğiniz bir adla değiştirdik (ilk karakterin küçük harfle hazır olduğunu unutmayın).

Ardından, Dizi Denetleyicilerini ve Ağaç Denetleyicilerini desteklemek için özel olarak bazı ad genel yöntemleri eklememiz gerekir:

[Export("addObject:")]
public void AddPerson(PersonModel person) {
    WillChangeValue ("personModelArray");
    isManager = true;
    _people.Add (person);
    DidChangeValue ("personModelArray");
}

[Export("insertObject:inPersonModelArrayAtIndex:")]
public void InsertPerson(PersonModel person, nint index) {
    WillChangeValue ("personModelArray");
    _people.Insert (person, index);
    DidChangeValue ("personModelArray");
}

[Export("removeObjectFromPersonModelArrayAtIndex:")]
public void RemovePerson(nint index) {
    WillChangeValue ("personModelArray");
    _people.RemoveObject (index);
    DidChangeValue ("personModelArray");
}

[Export("setPersonModelArray:")]
public void SetPeople(NSMutableArray array) {
    WillChangeValue ("personModelArray");
    _people = array;
    DidChangeValue ("personModelArray");
}

Bunlar, denetleyicilerin görüntülenilen verileri isteğine ve değiştirmesine olanak sağlar. Yukarıda ortaya konan gibi, bunlar da çok belirli bir adlandırma kuralına NSArray (tipik C# adlandırma kurallarından farklıdır) sahip olur:

  • addObject: - Diziye bir nesnesi ekler.
  • insertObject:in{class_name}ArrayAtIndex: - {class_name} Burada sınıfının adıdır. Bu yöntem, verilen dizinde diziye bir nesnesi ekler.
  • removeObjectFrom{class_name}ArrayAtIndex: - {class_name} Burada sınıfının adıdır. Bu yöntem, dizide yer alan nesneyi belirli bir dizinde kaldırır.
  • set{class_name}Array: - {class_name} Burada sınıfının adıdır. Bu yöntem, mevcut taşımayı yeni bir taşıma ile değiştirmenize olanak sağlar.

Bu yöntemlerin içinde, KVO uyumluluğu için içindeki ve iletileri WillChangeValueDidChangeValue dizisinde yapılan değişiklikleri sarmalamış oluruz.

Son olarak, özelliği özelliğinin değerine bağlı olduğu için özelliğinde yapılan değişiklikler VeriYeni Kullanıcı Arabirimi öğeleri için IconisManagerisManagerIcon (KVO sırasında) yansıtılamayabilirsiniz:

[Export("Icon")]
public NSImage Icon {
    get {
        if (isManager) {
            return NSImage.ImageNamed ("group.png");
        } else {
            return NSImage.ImageNamed ("user.png");
        }
    }
}

Bunu düzeltmek için aşağıdaki kodu kullanıruz:

[Export("isManager")]
public bool isManager {
    get { return _isManager; }
    set {
        WillChangeValue ("isManager");
        WillChangeValue ("Icon");
        _isManager = value;
        DidChangeValue ("isManager");
        DidChangeValue ("Icon");
    }
}

Erişimci, kendi Anahtarına ek olarak anahtarın ve iletilerini de göndererek değişikliği de isManagerWillChangeValueDidChangeValueIcon göreceğini unutmayın.

Bu makalenin geri PersonModel kalanında Veri Modeli'nin kullanılasıy.

Basit veri bağlama

Veri Modelimiz tanımlandığı için Xcode'un veri bağlama örneğine Interface Builder. Örneğin Xamarin.Mac uygulamamıza yukarıda tanımlandığımızı düzenlemek için PersonModel kullanılmaktadır. Modelimizin özelliklerini görüntülemek ve düzenlemek için birkaç Metin Alanı ve Onay Kutusu ekleyebilirsiniz.

İlk olarak, ana dosyamızda Main.storyboard dosyamıza yeni bir Görünüm Denetleyicisi ek Interface Builder sınıfını olarak bakalım:

SimpleViewController adlı bir sınıfa sahip yeni bir görünüm denetleyicisi ekleme.

Ardından Mac için Visual Studio'a geri dönüp SimpleViewController.cs dosyasını düzenleyin (projemize otomatik olarak eklenmiş olan dosya) ve form sayfamızı veri bağlaması için bir örneğini açın. Şu kodu ekleyin:

private PersonModel _person = new PersonModel();
...

[Export("Person")]
public PersonModel Person {
    get {return _person; }
    set {
        WillChangeValue ("Person");
        _person = value;
        DidChangeValue ("Person");
    }
}

Daha sonra Görünüm yüklendiğinde, örneğimizi oluşturarak şu PersonModel kodla tamamlarız:

public override void ViewDidLoad ()
{
    base.AwakeFromNib ();

    // Set a default person
    var Craig = new PersonModel ("Craig Dunn", "Documentation Manager");
    Craig.AddPerson (new PersonModel ("Amy Burns", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Joel Martinez", "Web & Infrastructure"));
    Craig.AddPerson (new PersonModel ("Kevin Mullins", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Mark McLemore", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Tom Opgenorth", "Technical Writer"));
    Person = Craig;

}

Şimdi form sayfamızı oluşturmamız, Main.storyboard dosyasına çift tıklar ve dosyada düzenleme için Interface Builder. Formu aşağıdakine benzer bir düzende düzenleme:

Xcode'da storyboard'ıdüzenleme

Formu Anahtar aracılığıyla ortaya çıkararak veri PersonModel bağlama için aşağıdaki adımları Person gerçekleştirin:

  1. Çalışan Adı Metin Alanını seçin ve Bağlamalar Denetçisi'ne geçiş.

  2. Bağlama kutusunu işaretleyin ve açılan listeden Basit Görünüm Denetleyicisi'ne tıklayın. Ardından Anahtar self.Person.Name Yolu self.Person.Name

    Anahtar Yolu için otomatik nokta kişi nokta adı girin.

  3. Meslek Metni Alanını seçin, Bağlama kutusunu işaretleyin ve açılan listeden Basit Görünüm Denetleyicisi'ne tıklayın. Ardından Anahtar self.Person.Occupation Yolu self.Person.Occupation

    Anahtar Yolu için kendi kendine nokta Kişi nokta İşlem girin.

  4. Çalışan YöneticiDir Onay Kutusunu seçin, Bağlama kutusunu işaretleyin ve açılan listeden Basit Görünüm Denetleyicisi'ni seçin. self.Person.isManagerself.Person.isManageriçin bir sonraki giriş:

    Anahtar yolu için kendi kendine noktalı kişi noktası IsManager giriliyor.

  5. Çalışanların yönettiği metin alanının sayısını seçin ve açılır kutuya bağla kutusunu Işaretleyin ve açılan listeden basit görünüm denetleyicisi ' ni seçin. self.Person.NumberOfEmployeesself.Person.NumberOfEmployeesiçin bir sonraki giriş:

    Anahtar yolu için kendi kendine noktalı kişi noktası sayısı çalışanları giriliyor.

  6. Çalışan bir yönetici değilse, çalışan tarafından yönetilen etiket ve metin alanı sayısını gizlemek istiyoruz.

  7. Çalışan tarafından yönetilen etiket sayısını seçin, gizli anahtar seçimini genişletin ve açılan kutudabasit görünüm denetleyicisi ' ni seçin. self.Person.isManagerself.Person.isManageriçin bir sonraki giriş:

    Yönetici olmayanlar Için anahtar yolu için kendi kendine noktalı kişi noktası isManager giriliyor.

  8. NSNegateBooleanNSNegateBoolean açılan listesinden seçin:

    NSNegateBoolean anahtar dönüşümünü seçme

  9. Bu, veri bağlamaya, özelliğin değeri ise etiketin gizlenmeyeceğini söyler isManagerfalse .

  10. Çalışanların yönettiği metin alanı sayısı için 7. ve 8. adımları yineleyin.

  11. değişikliklerinizi kaydedin ve xcode ile eşitlemek için Mac için Visual Studio geri dönün.

Uygulamayı çalıştırırsanız, Person özelliğindeki değerler otomatik olarak formumuzu dolduracaktır:

Showing an auto-populated formOtomatik doldurulmuş formu gösteren otomatik

Kullanıcıların forma yaptığı tüm değişiklikler, Person Görünüm denetleyicisindeki özelliğine geri yazılır. Örneğin, çalışanın seçimini kaldırmak bir yönetici , bizim örneğinizi PersonModel ve PersonModel etiket ve metin alanının sayısını otomatik olarak gizlidir (veri bağlama aracılığıyla):

Yönetici olmayanlar için çalışan sayısını gizleme

Tablo görünümü veri bağlama

Artık veri bağlamanın temel bilgileri olduğuna göre, bir dizi denetleyicisi ve tablo görünümüne veri bağlama kullanarak daha karmaşık bir veri bağlama görevine göz atalım. Tablo görünümleriyle çalışma hakkında daha fazla bilgi için lütfen tablo görünümlerimize bakın.

İlk olarak, Interface Builder ana. görsel taslak dosyanıza yeni bir Görünüm denetleyicisi ekleyelim ve sınıfını adı :

TableViewController adlı bir sınıf ile yeni bir görünüm denetleyicisi ekleme.

Daha sonra, Tableviewcontroller. cs dosyasını düzenleyelim (Bu, projemizi otomatik olarak eklendi) ve PersonModel formumuzu veri bağlamamız olacak sınıfların bir dizisini () kullanıma sunar. Şu kodu ekleyin:

private NSMutableArray _people = new NSMutableArray();
...

[Export("personModelArray")]
public NSArray People {
    get { return _people; }
}
...

[Export("addObject:")]
public void AddPerson(PersonModel person) {
    WillChangeValue ("personModelArray");
    _people.Add (person);
    DidChangeValue ("personModelArray");
}

[Export("insertObject:inPersonModelArrayAtIndex:")]
public void InsertPerson(PersonModel person, nint index) {
    WillChangeValue ("personModelArray");
    _people.Insert (person, index);
    DidChangeValue ("personModelArray");
}

[Export("removeObjectFromPersonModelArrayAtIndex:")]
public void RemovePerson(nint index) {
    WillChangeValue ("personModelArray");
    _people.RemoveObject (index);
    DidChangeValue ("personModelArray");
}

[Export("setPersonModelArray:")]
public void SetPeople(NSMutableArray array) {
    WillChangeValue ("personModelArray");
    _people = array;
    DidChangeValue ("personModelArray");
}

PersonModelPersonModel bölümünde yukarıdaki sınıfta yaptığımız gibi, dizi denetleyicisi ve koleksiyonumuza veri okumak ve yazmak için dört özel olarak adlandırılmış ortak yöntem kullanıma sunduk PersonModels .

Görünüm yüklendiğinde, dizimizi şu kodla doldurmamız gerekir:

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Build list of employees
    AddPerson (new PersonModel ("Craig Dunn", "Documentation Manager", true));
    AddPerson (new PersonModel ("Amy Burns", "Technical Writer"));
    AddPerson (new PersonModel ("Joel Martinez", "Web & Infrastructure"));
    AddPerson (new PersonModel ("Kevin Mullins", "Technical Writer"));
    AddPerson (new PersonModel ("Mark McLemore", "Technical Writer"));
    AddPerson (new PersonModel ("Tom Opgenorth", "Technical Writer"));
    AddPerson (new PersonModel ("Larry O'Brien", "API Documentation Manager", true));
    AddPerson (new PersonModel ("Mike Norman", "API Documenter"));

}

Şimdi tablo görünümümüzü oluşturmamız gerekiyor. Interface Builder içinde düzenlenmek üzere açmak için ana. görsel taslak dosyasına çift tıklayın. Tabloyu aşağıdakine benzer bir şekilde görmek için yerleştirin:

Laying out a new table viewYeni tablo

Tablolarımızla bağlantılı veriler sağlamak için bir dizi denetleyicisi eklememiz gerekiyor, şunları yapın:

  1. Kitaplık denetçisinden bir dizi denetleyicisiniarabirim düzenleyicisinesürükleyin:

    Kitaplıktan birdizi denetleyicisi seçme kitaplıktan bir seçme

  2. Arabirim hiyerarşisindedizi denetleyicisi ' ni seçin ve öznitelik denetçisinegeçin:

    Selecting the Attributes InspectorÖznitelikler

  3. PersonModelPersonModelIçin girin, artı düğmesine tıklayın ve üç anahtar ekleyin. Onları adlandırın NameOccupation ve isManager :

    Nesne denetleyicisine gerekli anahtar yolları ekleniyor.

  4. Bu, dizi denetleyicisine bir diziyi ne yönetiyor olduğunu ve hangi özelliklerin (anahtarlar aracılığıyla) ortaya çıkarmasını söyler.

  5. Bağlama denetçisine geçiş yapın ve Içerik dizisi altında bağlama ve Tablo görünümü denetleyicisi' ni seçin. Bir model anahtar yolu girin :

    Entering a key pathAnahtar yolu

  6. Bu, dizi denetleyicisini, PersonModels Görünüm denetleyicimizde kullanıma sunduğumuz diziye bağlıdır.

Şimdi tablo görünümümüzü dizi denetleyicisine bağlamanız gerekiyor, şunları yapın:

  1. Tablo görünümü ve bağlama denetçisiniseçin:

    Tablo görünümü ve bağlama denetçisi seçiliyor.

  2. Tablo içeriği kapatma altında, bağla ve dizi denetleyicisi' ni seçin. arrangedObjectsarrangedObjects alanı için girin:

    Denetleyici anahtarını tanımlayan

  3. Çalışan sütununun altındaki Tablo görünümü hücresini seçin. Değer Seç ' ın altındaki bağlamalar denetçisinde , bağla ve Tablo hücresi görünümü' nü seçin. objectValue.NameobjectValue.Nameiçin girin:

    Çalışan sütunu için model anahtar yolu ayarlanıyor.

  4. objectValue , dizi PersonModel denetleyicisi tarafından yönetilmekte olan dizide geçerli olur.

  5. Meslek sütununun altındaki Tablo görünümü hücresini seçin. Değer Seç ' ın altındaki bağlamalar denetçisinde , bağla ve Tablo hücresi görünümü' nü seçin. objectValue.OccupationobjectValue.Occupationiçin girin:

    Meslek sütunu için model anahtar yolu ayarlanıyor.

  6. değişikliklerinizi kaydedin ve xcode ile eşitlemek için Mac için Visual Studio geri dönün.

Uygulamayı çalıştırdığımızda, tablo şu dizimizle doldurulacak PersonModels :

Personmodellerdeki diziyi dolduran uygulamayı çalıştırma.

Ana Hat görünümü veri bağlama

bir anahat görünümüne yönelik veri bağlama, Tablo görünümüne göre bağlamaya çok benzer. Temel fark, bir dizi denetleyicisi yerine, ana hat görünümüne bağlanan verileri sağlamak Için bir ağaç denetleyicisi kullanmaktır. Ana hat görünümleriyle çalışma hakkında daha fazla bilgi için lütfen bkz. ana hat görünümlerimize bakın.

İlk olarak, Interface Builder ana. görsel taslak dosyanıza yeni bir Görünüm denetleyicisi ekleyelim ve sınıfını adı :

OutlineViewController adlı bir sınıf ile yeni bir görünüm denetleyicisi ekleme.

Ardından, Outlineviewcontroller. cs dosyasını düzenleyelim (Bu, projemizi otomatik olarak eklendi) ve PersonModel formumuzu veri bağlamamız olacak sınıfların bir dizisini () kullanıma sunar. Şu kodu ekleyin:

private NSMutableArray _people = new NSMutableArray();
...

[Export("personModelArray")]
public NSArray People {
    get { return _people; }
}
...

[Export("addObject:")]
public void AddPerson(PersonModel person) {
    WillChangeValue ("personModelArray");
    _people.Add (person);
    DidChangeValue ("personModelArray");
}

[Export("insertObject:inPersonModelArrayAtIndex:")]
public void InsertPerson(PersonModel person, nint index) {
    WillChangeValue ("personModelArray");
    _people.Insert (person, index);
    DidChangeValue ("personModelArray");
}

[Export("removeObjectFromPersonModelArrayAtIndex:")]
public void RemovePerson(nint index) {
    WillChangeValue ("personModelArray");
    _people.RemoveObject (index);
    DidChangeValue ("personModelArray");
}

[Export("setPersonModelArray:")]
public void SetPeople(NSMutableArray array) {
    WillChangeValue ("personModelArray");
    _people = array;
    DidChangeValue ("personModelArray");
}

PersonModelPersonModel bölümünde yukarıdaki sınıfta yaptığımız gibi, ağaç denetleyicisi ve koleksiyonumuza ait verileri okumak ve yazmak için dört özel olarak adlandırılmış ortak yöntem kullanıma sunduk PersonModels .

Görünüm yüklendiğinde, dizimizi şu kodla doldurmamız gerekir:

public override void AwakeFromNib ()
{
    base.AwakeFromNib ();

    // Build list of employees
    var Craig = new PersonModel ("Craig Dunn", "Documentation Manager");
    Craig.AddPerson (new PersonModel ("Amy Burns", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Joel Martinez", "Web & Infrastructure"));
    Craig.AddPerson (new PersonModel ("Kevin Mullins", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Mark McLemore", "Technical Writer"));
    Craig.AddPerson (new PersonModel ("Tom Opgenorth", "Technical Writer"));
    AddPerson (Craig);

    var Larry = new PersonModel ("Larry O'Brien", "API Documentation Manager");
    Larry.AddPerson (new PersonModel ("Mike Norman", "API Documenter"));
    AddPerson (Larry);

}

Artık anahat görünümümüzü oluşturmanız gerekir, ana. görsel taslak dosyasına çift tıklayarak Interface Builder içinde düzenlenecek şekilde açın. Tabloyu aşağıdakine benzer bir şekilde görmek için yerleştirin:

Creating the outline viewAnahat hat

Ana hatlarıyla bağlantılı veriler sağlamak için bir ağaç denetleyicisi eklememiz gerekiyor, şunları yapın:

  1. Kitaplık denetçisinden bir ağaç denetleyicisiniarabirim düzenleyicisinesürükleyin:

    Kitaplıktan ağaç denetleyicisi seçme

  2. Arabirim hiyerarşisindeağaç denetleyicisi ' ni seçin ve öznitelik denetçisinegeçin:

    Selecting the Attribute InspectorÖznitelik denetçisini

  3. PersonModelPersonModelIçin girin, artı düğmesine tıklayın ve üç anahtar ekleyin. Onları adlandırın NameOccupation ve isManager :

    PersonModel için gerekli anahtar yolları ekleniyor.

  4. Bu, ağaç denetleyicisine bir diziyi ne yönetiyor olduğunu ve hangi özelliklerin (anahtarlar aracılığıyla) ortaya çıkarmasını söyler.

  5. Ağaç denetleyicisi bölümünde, alt öğeleriçin girin, say altına girin ve yaprakaltına girin:

    Setting the Tree Controller key pathsAğaç denetleyicisi anahtar yolları ayarlama ağaç denetleyicisi anahtar

  6. Bu, ağaç denetleyicisine herhangi bir alt düğümü nerede bulacağını, kaç alt düğüm olduğunu ve geçerli düğümün alt düğümleri olduğunu belirtir.

  7. Bağlama denetçisine geçiş yapın ve içerik dizisi altında, bağı ve dosyanın sahibiniseçin. Bir model anahtar yolu girin :

    Editing the key pathAnahtar yolunu

  8. Bu, ağaç denetleyicisini, PersonModels Görünüm denetleyicimizde kullanıma sunduğumuz diziye bağlıdır.

Şimdi de, ana hat görünümümüzü ağaç denetleyicisine bağlamanız gerekiyor, şunları yapın:

  1. Ana hat görünümünü seçin ve bağlama denetçisinde şunları seçin:

    Ana hat görünümü ve bağlama denetçisi seçiliyor.

  2. Ana hat görünümü içerikleri aşağı doğru seçeneğinin altında, bağla ve ağaç denetleyicisi' ni seçin. arrangedObjectsarrangedObjects alanı için girin:

    Setting the controller keyDenetleyici anahtarı denetleyici

  3. Çalışan sütununun altındaki Tablo görünümü hücresini seçin. Değer Seç ' ın altındaki bağlamalar denetçisinde , bağla ve Tablo hücresi görünümü' nü seçin. objectValue.NameobjectValue.Nameiçin girin:

    Model anahtar yolu değeri objectvalue nokta adı giriliyor.

  4. objectValue , PersonModel ağaç denetleyicisi tarafından yönetilmekte olan dizide geçerli olur.

  5. Meslek sütununun altındaki Tablo görünümü hücresini seçin. Değer Seç ' ın altındaki bağlamalar denetçisinde , bağla ve Tablo hücresi görünümü' nü seçin. objectValue.OccupationobjectValue.Occupationiçin girin:

    Model anahtar yolu değeri objectvalue nokta meslek olarak giriliyor.

  6. değişikliklerinizi kaydedin ve xcode ile eşitlemek için Mac için Visual Studio geri dönün.

Uygulamayı çalıştırdığımızda, ana hat şu dizimizle doldurulur PersonModels :

Personbu dizinimizi dolduran uygulamayı çalıştırma.

Koleksiyon görünümü veri bağlama

Koleksiyon görünümü ile veri bağlama, koleksiyon için veri sağlamak için bir dizi denetleyicisi kullanıldığı için tablo görünümü ile bağlama çok benzer. Koleksiyon görünümü önceden ayarlanmış bir görüntüleme biçimine sahip olmadığından, Kullanıcı etkileşimi geri bildirimi sağlamak ve Kullanıcı seçimini izlemek için daha fazla iş gerekir.

Önemli

Xcode 7 ve macOS 10,11 (ve üzeri) içindeki bir sorun nedeniyle, koleksiyon görünümleri bir görsel taslak (. görsel taslak) dosyalarının içinde kullanılamaz. Sonuç olarak, Xamarin. Mac uygulamalarınız için koleksiyon görünümlerinizi tanımlamak üzere. XIB dosyalarını kullanmaya devam etmeniz gerekecektir. Daha fazla bilgi için lütfen koleksiyon görünümleri belgelerimize bakın.

Yerel kilitlenmelerden hata ayıklama

Veri Bağlamalarınızın bir hata olması, yönetilmeyen kodda Yerel kilitlenmeyle sonuçlanabilir ve Xamarin. Mac uygulamanızın hatayla tamamen başarısız olmasına neden olur :

Example of a native crash dialog boxYerel kilitlenmekutusu örneği

Veri bağlama sırasında yerel kilitlenmeler için genellikle dört önemli neden vardır:

  1. Veri modeliniz öğesinden NSObject veya bir alt sınıftan türetilmiyor NSObject .
  2. Özniteliğini kullanarak özelliğini kullanıma sunmadınız Objective-C[Export("key-name")] .
  3. Değişiklikleri erişimcinin değerine WillChangeValue ve DidChangeValue metot çağrılarına sarmadınız (özniteliğiyle aynı anahtarı belirterek Export ).
  4. Interface Builder içinde bağlama denetçisinde yanlış veya yanlış yazmış bir anahtarınız var.

Kilitlenme kodunu çözme

Veri bağlamamız üzerinde yerel bir kilitlenme olmasına neden olur, bu sayede bulmayı ve düzeltmesini gösterebilirsiniz. Interface Builder, koleksiyon görünümü örneğinde ilk etiket bağlamamızı şu şekilde değiştirelim NameTitle :

Editing the binding keyBağlama anahtarını düzenleyen

değişikliği kaydedelim, xcode ile eşitlemek ve uygulamamızı çalıştırmak için Mac için Visual Studio geri dönün. koleksiyon görünümü görüntülendiğinde, SIGABRT anahtar ile bir özelliği kullanıma sunmadığından, uygulama bir hatayla (Mac için Visual Studio SIGABRT gösterildiği gibi) zaman içinde kilitlenir PersonModelTitle :

Example of a binding errorBağlama hatası bağlama

Uygulama çıkışında hatanın en üstüne ilerliyoruz, sorunu çözmek için anahtarı görebiliriz:

günlüğünde bulma hata günlüğünde bulma

Bu satır, anahtarın Title bağlamamız gereken nesne üzerinde mevcut olmadığını bize söylemiş. NameInterface Builder, Kaydet, Eşitle, yeniden oluştur ve Çalıştır gibi bir bağlamayı geri değiştirirseniz, uygulama sorun olmadan beklendiği gibi çalışır.

Özet

Bu makale, bir Xamarin. Mac uygulamasında veri bağlama ve anahtar-değer kodlaması ile çalışma konusunda ayrıntılı bir bakış gerçekleştirmiştir. İlk olarak, Objective-C anahtar-değer kodlama (KVC) ve anahtar-değer gözlemleme (KVO) kullanarak bir C# sınıfını kullanıma sunma konusuna baktık. Ardından, bir KVO uyumlu sınıfı kullanmayı ve verileri Xcode 'un Interface Builder Kullanıcı Arabirimi öğelerine bağlamayı gösterdi. Son olarak, dizi denetleyicileri ve ağaç denetleyicilerikullanılarak karmaşık veri bağlamayı gösterdi.