سؤال

أحتاج إلى معرفة ما هو الإجراء لإجراء خاصية التبعية فقط. أستطيع أن أرى أن فئة DESTECTYCTYPROPERTY لا تحتوي على طريقة خاصة "تسجيل" خصائص الكتابة فقط، لكن ليس لدي أي فكرة عما إذا كانت الطريقة المسجلة قد تنطبق على ما أحاول القيام به.

تحتاج هذه الخاصية إلى أن تكون ممتلكات تبعية، بدلا من خاصية CLR بسيطة. داخليا، يتطلب صفي خصما propertychangedcallback في هذا العقار من أجل البقاء مستقرا.

أعلم أن خصائص التبعية فقط فقط يمكن إنشاءها، لأنها مذكورة بوضوح تماما في:
برو C # 2008 و .ينت 3.5 منصة، صفحة 1061.
ومع ذلك، هذا هو المكان الوحيد الذي يمكنني حتى أجده حتى "خاصية التبعية" و "الكتابة فقط" في نفس الصفحة. ويبدو أن هذا المؤلف لا يعتقد أنه كان من الضروري إظهار القارئ في الواقع إجراء أي شيء آخر غير الممتلكات الأساسية للقراءة والكتابة الأساسية. بالطبع، هذا الكتاب استطاع كن حمولة من BS - ولكن هذا الكتاب يبدو قياسي جميل، لذلك أعتقد أنه رهان آمن جدا أن المؤلف صحيح. أفترض أن عدم وجود معلومات على الإنترنت ينبع من حقيقة أنه لا يحتاج أحد عموما إلى عمل خاصية مثل هذا.

أعلم أنه يبدو مشكا للنقل جدا أن ترغب في جعل خاصية التبعية الخاصة بك فقط. أؤكد لكم أنه منطقي حيث أريد ذلك. صفي لديه خاصية قيمة لها مفيدة فقط للكائن إعداده. إذا كان كائن آخر يطلبان قيمة هذه الخاصية لاحقا، فلن تتمكن من إخراج أي معنى عقلاني من القيمة دون معرفة السياق الأصلي للمضبط.

لا يهدف هذا العقار إلى استخدام لأغراض إعلامية. إن ترك كائنات خارجية محاولة استخدام قيمة العقار بهذه الطريقة هي إشكالية وخطيرة ومخاطر أمنية. لذلك أعتقد أن أفضل تصميم هو حظر عمليات القراءة في هذه الخاصية. ستجد أي شخص يستخدم من صفي أنهم يجبرون على استخدام الطبقة بالطريقة التي كان المقصود منها، والتي ستعمل بشكل أفضل وأكثر نظافة في النهاية.

هل كانت مفيدة؟

المحلول

لا يمكنك ذلك، وهذا يبدو أنه من خلال التصميم. في حين أستطيع أن أفهم نهجك للكتاب المذكور وأي طريقة استجائه بجودته، ما زلت أفترض أن هذا هو نوع من النسخ واللصق أو مشكلة مماثلة. هنا هو بلدي التفكير:

WPF رمز نظام الخاصية

WPF تصميم نظام الممتلكات

  • اكثر اهمية، "تنفيذ WPF الحالي لمعالج XAML الخاص به هو علم الخصائص التبعية بطبيعته. يستخدم معالج WPF XAML أساليب نظام الخصائص خصائص التبعية عند تحميل سمات XAML والمعالجة الثنائية التي هي خصائص التبعية. هذا يتجاوز بفعالية مغريات العقارات., ، يرى خصائص التحميل XAML.
  • الأهم، "خصائص التبعية ينبغي اعتبارها خصائص عامة. يمنع طبيعة نظام خاصية Foundation Foundation (WPF) في Windows (WPF) القدرة على إجراء ضمانات أمنية حول قيمة خاصية التبعية., ، يرى التبعية الأمنية الأمنية.

خاصة النقاط الأخيرة هي تحدد قيود التصميم، أن قيم خاصية التبعية يمكن الوصول إليها دائما عبر الحصول على قيمة()/setvalue (), ، بغض النظر عما إذا كانت مغلفة CLR الخاصة بهم مقيدة أو متوفرة على الإطلاق، مع الاستثناء الوحيد الذي تم حسابه خصيصا خصائص التبعية للقراءة فقط.

وبالتالي، وكذلك جيفز الإجابة يعني بالفعل، فقط إزالة Getter على سبيل المثال لا يمنع حقا أي شخص يصل إلى العقار عبر الحصول على قيمة(), على الرغم من أن هذا قد على الأقل 'قلل مساحة الاسم المكشوفة على الفور من فئة مخصصة ". وبعد فائدة أي حل من هذا الحلال الدلالي لجعل قيمة العقار أقل وضوحا إلى حد ما والقيمة المستردة بدون فائدة لا معنى لها بطبيعتها للعملاء كما اقترح جيف يعتمد على سيناريو الخاص بك بالطبع.

نصائح أخرى

مثيرة للاهتمام، وهذا بالتأكيد سيناريو نادر، سأكون مهتما بالسماع أكثر في ما يتيح.

هل تفكر في فكرة توفير قيمة غير صالحة (مثل NULL) للقراءة من خلال الربط أو GetValue، مع عدم وجود Getter CLR؟

إما استخدام الإعتدال الخاصproperty لتخزين القيمة "الحقيقية" التي تهتم بها، أو مجرد متغير عضو خاص.

في مكان الإقامة تغيير رد الاتصال، قم دائما بالعودة إلى القيمة مرة أخرى إلى القيمة الأصلية، مع تخزين القيمة الجديدة التي تم تعيينها.

أقضي معظم وقتي في تطوير مراقبة Silverlight الآن، بحيث تعمل هذه الخاصية في WPF و Silverlight-Land، ولا تستخدم CRECIAN أو أي شيء ممتع من هذا القبيل. ربما يجعلك تسير على المسار الصحيح، رغم ذلك.

    /// <summary>
    /// Sets the write-only dependency property.
    /// </summary>
    public string MyWriteOnlyDependencyProperty
    {
        set { SetValue(MyWriteOnlyDependencyPropertyProperty, value); }
    }

    private string _theRealSetValue;

    private bool _ignorePropertyChange;

    /// <summary>
    /// Identifies the MyWriteOnlyDependencyProperty dependency property.
    /// </summary>
    public static readonly DependencyProperty MyWriteOnlyDependencyPropertyProperty =
        DependencyProperty.Register(
            "MyWriteOnlyDependencyProperty",
            typeof(string),
            typeof(TemplatedControl1),
            new PropertyMetadata(null, OnMyWriteOnlyDependencyPropertyPropertyChanged));

    /// <summary>
    /// MyWriteOnlyDependencyPropertyProperty property changed handler.
    /// </summary>
    /// <param name="d">TemplatedControl1 that changed its MyWriteOnlyDependencyProperty.</param>
    /// <param name="e">Event arguments.</param>
    private static void OnMyWriteOnlyDependencyPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TemplatedControl1 source = d as TemplatedControl1;
        if (source._ignorePropertyChange)
        {
            source._ignorePropertyChange = false;
            return;
        }
        string value = e.NewValue as string;

        source._theRealSetValue = value;

        // Revert, since this should never be accessible through a read
        source._ignorePropertyChange = true;
        source.SetValue(e.Property, e.OldValue);
    }

يبدو أنك تستطيع استخدام CoerceValueCallback المرتبطة العقار عبر FrameworkPropertyMetadata تطبق في تعريف خاصية التبعية. قم فقط بتثبيت رد الاتصال الذي يأخذ الوسيطة الثانية، والقيمة الجديدة، يمرها إلى الكائن عبر آلية الكتابة الخاصة بك فقط، ثم إرجاع null (أو لأنواع القيمة، default(T)).

صحيح أن "nent يتذكر القيمة الأصلية قبل الإكراه"، لكن لن يتم نشرها عبر ملزمة البيانات. مكالمات إلى GetValue سيعود القيمة الإكراه، التي لا تسرب أي شيء.

أنا أستخدم هذا لتنفيذ STILETS الراحة في اتجاه واحد لقيمة الخاصية الأساسية، وهو سلسلة من البايتات. يمكن للمستخدم ربط سلسلة، على سبيل المثال، لتعيين الخاصية الأساسية إلى البايت المشفرة (ASCII أو UTF-8، اعتمادا على الممتلكات التي تم تعيينها). ولكن ليس كل تسلسلات البايت صالحة UTF-8، لذلك من الممكن عكس التحويل وقراءة سلسلة مرة أخرى من خلال خاصية الراحة.

public string AsciiData
{
    set { BinaryArray = Encoding.ASCII.GetBytes(value); }
}

public static readonly DependencyProperty AsciiDataProperty =
    DependencyProperty.Register("AsciiData",
        typeof(string),
        typeof(HexView),
        new FrameworkPropertyMetadata(null, CoerceAsciiData));

private static object CoerceAsciiData(DependencyObject target, object value)
{
    (target as HexView).AsciiData = value as string;
    return null;
}

يمكن إزالة معالج الإكراه عبر استبدال البيانات الوصفية، لذلك هذا لا يوفر الأمان, ، لكنه سيمنع المطورين من خلق اقتران بطريق الخطأ بطرق خاطئة.

أنا مرتبك لأنك لا يمكنك فقط الحصول على "الحصول على" لعدم أي شيء مفيد؟

ولكن علاوة على ذلك، ربما لا تنفذ فقط "onmywriteonlydependencypropertychanged"، في مثال جيف.

لا يوجد سبب حقيقي للحصول على الحدث، إذا كان لا أحد يستطيع قراءته، أليس كذلك؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top