Aracılığıyla paylaş


Etki alanı özelliği değeri değişikliği işleyicileri

İçinde bir Visual Studio etki alanı özelliğinin değeri değiştiğinde, etki alanına özgü dil OnValueChanging() ve OnValueChanged() etki alanı özellik işleyicisi yöntemleri çağrılabilir.Değişikliğe yanıt vermek için bu yöntemleri geçersiz kılar.

Özellik işleyicisi yöntemleri geçersiz kılma

Etki alanına özgü dilinizi her etki alanı özelliği, kendi ana etki alanı sınıf içinde yuvalanmış bir sınıf tarafından işlenir.Biçim adını izleyen PropertyNamePropertyHandler.Bu özellik işleyicisi sınıf dosyasını inceleyebilirsiniz Dsl\Generated Code\DomainClasses.cs.Sınıfta OnValueChanging() değer değişiklikleri hemen önce adı verilen ve OnValueChanged() değer değiştikten hemen sonra denir.

Örneğin, adlı bir etki alanı sınıfı olduğunu varsayalım Yorum adlı bir dize domain özelliği olan metin ve adında bir tamsayı özellik TextLengthCount.Neden TextLengthCount her zaman uzunluğunu içerecek şekilde metin dize, yazabilirsiniz aşağıdaki kodu ayrı bir Dsl proje dosyasında:

  // Domain Class "Comment":
  public partial class Comment 
  {
    // Domain Property "Text":
    partial class TextPropertyHandler
    {
      protected override void OnValueChanging(CommentBase element, string oldValue, string newValue)
      {
        base.OnValueChanging(element, oldValue, newValue);

        // To update values outside the Store, write code here.

        // Let the transaction manager handle undo:
        Store store = element.Store;
        if (store.InUndoRedoOrRollback || store.InSerializationTransaction) return;

        // Update values in the Store:
        this.TextLengthCount = newValue.Length;
      }
    }
  }

Özellik işleyicileri hakkında aşağıdaki noktalara dikkat edin:

  • Özellik işleyicisi yöntemi, kullanıcı bir etki alanı özellik değişiklikler yaptığında, hem program kodu özellik için farklı bir değer atarken denir.

  • Yalnızca değeri gerçekte değiştiğinde yöntemleri olarak adlandırılırlar.İşleyicisi çağrılır, program kodu geçerli değerine eşit bir değer atar.

  • Hesaplanan ve özel depolama etki alanı özellikleri, OnValueChanged ve OnValueChanging yöntemlerini gerekmez.

  • Yeni değerini değiştirmek için Değiştir işleyicisini kullanamazsınız.Bunu, örneğin belirli bir aralığı değerini kısıtlamak, tanımlamak yapmak istiyorsanız, bir ChangeRule.

  • Bir ilişki rolünü gösteren bir özellik değişikliği işleyicisi ekleyemezsiniz.Bunun yerine, tanımladığınız bir AddRule ve bir DeleteRule ilişki sınıfı.Bağlantı oluşturulduğunda veya değiştirildiğinde, bu kurallar tetiklenir.Daha fazla bilgi için bkz. Kuralları modelindeki değişiklikleri yaymak.

Bb126481.collapse_all(tr-tr,VS.110).gifDeğişiklikleri içine ve dışına deposu

Değişikliğin başlatan işlem içinde özellik işleyicisi yöntemi olarak adlandırılır.Bu nedenle, yeni bir hareket açmadan deposunda daha fazla değişiklik yapabilirsiniz.Değişikliklerinizi ek işleyici çağrılarını yavaşlamaya neden olabilir.

Bir hareketi geri alınıyor, geri alınmış veya geri, değişiklik değil deposunda, diğer bir deyişle modeli öğeleri, ilişkilerini, şekilleri, bağlayıcılar diyagramları veya bunların özelliklerini değiştirir.

Model dosyadan yüklendiğinde Üstelik, genellikle değerleri güncelleştirmek değil.

Böyle bir test olarak model değişiklikleri bu nedenle olası:

if (!store.InUndoRedoOrRollback 
         && !store. InSerializationTransaction)
{ this.TextLength = ...; // in-store changes 
}

Bunun aksine, mağaza dışında değişiklik yaptığınız özellik işleyicisi yayar, örneğin, bir dosya, veritabanı veya mağaza olmayan değişkenler için sonra her zaman kullanıcı geri istediğinde dış değerleri güncelleştirilir, bu değişiklik veya Yinele.

Bb126481.collapse_all(tr-tr,VS.110).gifDeğişiklik iptal etme

Bir değişikliği engellemek istiyorsanız, geçerli işlem geri dönebilirsiniz.Örneğin, bir özelliği belirli bir aralık içerisinde kalmasını sağlamak isteyebilirsiniz.

if (newValue > 10) 
{ store.TransactionManager.CurrentTransaction.Rollback();
  System.Windows.Forms.MessageBox.Show("Value must be less than 10");
} 

Bb126481.collapse_all(tr-tr,VS.110).gifAlternatif yöntem: hesaplanan Özellikler

Önceki örnekte, OnValueChanged() bir etki alanı özelliği değerlerini yaymak için nasıl kullanılabileceğini gösterir.Her özelliğin kendi saklanan değeri vardır.

Bunun yerine, türetilmiş özelliği bir hesaplanan özellik olarak tanımlayan düşünebilirsiniz.Büyük/küçük harf özelliği kendi hiçbir depolama alanına sahip ve tanımlama ise değeri gerekli olduğunda işlevi değerlendirilir.Daha fazla bilgi için bkz. Hesaplanan ve özel depolama özellikleri.

Önceki örnek yerine ayarlayabilirsiniz tür alanının TextLengthCount olarak hesaplanan dsl View definition.Kendi konuşmacının Al bu etki alanı özellik için yöntem.Al yöntemi geçerli uzunluğu dönmek metin dize.

Ancak, olası bir olumsuzluk hesaplanan özelliklerinin değeri, bir performans sorununu sunabilir, her kullanılışında deyimi değerlendirilir değildir.Ayrıca, var. hiç OnValueChanging() ve OnValueChanged() hesaplanan bir özellik.

Bb126481.collapse_all(tr-tr,VS.110).gifAlternatif yöntem: kuralları Değiştir

Bir ChangeRule tanımlarsanız, bir özelliğin değeri değiştiği bir işlemin sonunda yürütülür.Daha fazla bilgi için bkz. Kuralları modelindeki değişiklikleri yaymak.

Tek bir işlemle birkaç değişiklik yapılırsa, tüm tamamlandı olduğunda ChangeRule yürütür.Karşıtlık, OnValue tarafından...Bazı değişiklikler değil gerçekleştirilmiş, yöntemi çalıştırılır.Elde etmek istediğinize bağlı olarak, bu bir ChangeRule daha uygun duruma getirebilir.

Bir ChangeRule, belirli bir aralıkta tutmak için özelliğin yeni değerini ayarlamak için de kullanabilirsiniz.

Uyarı notuUyarı

Kural deposunu içeriği değişiklik yaparsa, diğer kurallar ve özellik işleyicileri tetikleyen.Bir kural onu tetikleyen özellik değişirse yeniden çağrılmayacak.Sonsuz tetikleyen kural Tanımlarınızın sonuçlanmayan emin olmanız gerekir.

using Microsoft.VisualStudio.Modeling; 
...
// Change rule on the domain class Comment:
[RuleOn(typeof(Comment), FireTime = TimeToFire.TopLevelCommit)] 
class MyCommentTrimRule : ChangeRule
{
  public override void 
    ElementPropertyChanged(ElementPropertyChangedEventArgs e)
  {
    base.ElementPropertyChanged(e);
    Comment comment = e.ModelElement as Comment;
      
    if (comment.Text.StartsWith(" ") || comment.Text.EndsWith(" "))
      comment.Text = comment.Text.Trim();
    // If changed, rule will trigger again.
  }
}

// Register the rule: 
public partial class MyDomainModel 
{
 protected override Type[] GetCustomDomainModelTypes() 
 { return new Type[] { typeof(MyCommentTrimRule) }; 
 }
} 

Örnek

Bb126481.collapse_all(tr-tr,VS.110).gifDescription

Aşağıdaki örnek bir etki alanı özellik özellik işleyicisi geçersiz kılar ve bir özellik için kullanıcıya bildirir ExampleElement etki alanı sınıfı değişti.

Bb126481.collapse_all(tr-tr,VS.110).gifKod

using DslModeling = global::Microsoft.VisualStudio.Modeling;
using DslDesign = global::Microsoft.VisualStudio.Modeling.Design;

namespace msft.FieldChangeSample
{
  public partial class ExampleElement
  {
    internal sealed partial class NamePropertyHandler
    {
      protected override void OnValueChanged(ExampleElement element,
         string oldValue, string newValue)
      {
        if (!this.Store.InUndoRedoOrRollback)
        {
           // make in-store changes here...
        }
        // This part is called even in undo:
        System.Windows.Forms.MessageBox.Show("Value Has Changed");
        base.OnValueChanged(element, oldValue, newValue);
      }
    }
  }
}

Ayrıca bkz.

Başvuru

OnValueChanged

OnValueChanging