سؤال

لقد تعلمت كل شيء عن الربط في WPF.أواجه الكثير من المشاكل في تصحيح أخطاء التحليل في xaml الخاص بي.هل يمكن لأي شخص جميل أن يخبرني ما هو الخطأ في هذه القطعة الصغيرة؟:

<Border Name="TrackBackground"
    Margin="0"
    CornerRadius="2"                     
    Grid.Row="1"
    Grid.Column="1"
    Background="BlanchedAlmond"
    BorderThickness="1"
    Height="{TemplateBinding Height}">

    <Canvas Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
        <Thumb Name="ThumbKnob" Height="{Binding ElementName=Part_Track, Path=Height, Mode=OneWay}" />
    </Canvas>
</Border>

إنه ربط البيانات الذي ينكسر.أحصل على InvalidAttributeValue استثناء ThumbKnob.Height عندما أحاول تشغيل هذا.أعلم أنني يجب أن أفتقد شيئًا أساسيًا.لذا املأوني أيها المعبئون، وسيكون امتناني بلا حدود.


لم يساعد تغيير اسم العنصر.لا بد أن هناك شيئًا آخر لا أحصل عليه.

يجب أن أذكر أنني أختبر هذا في Silverlight.الرسالة الدقيقة التي أخرجها من Internet Explorer هي:

XamlParseException: Invalid attribute value for property Height.

هذا الأمر برمته موجود داخل ControlTemplate.أقوم بإجراء عنصر تحكم في شريط التمرير فقط لتعليم نفسي المفاهيم.

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

المحلول

خاصية ElementName الموجودة على الرابط غير مدعومة في Silverlight.

ستلاحظ، إذا ذهبت إلى الكود الموجود خلف كائن Binding أو قمت بفحصه في مستكشف الفئة، فإنه لا يحتوي على خاصية تسمى ElementName.

نصائح أخرى

ما أفعله عادةً لتصحيح أخطاء ربط البيانات هو إضافة محول حيث يمكنني تعيين نقطة توقف في VS.NET..

وبالتالي فإن الربط سيكون مثل هذا:

{Binding ElementName=PART_Track, Path=Height, Mode=OneWay, Converter={StaticResources DebugConverter}}

بعد ذلك، يمكن أن يكون المحول تطبيقًا فارغًا لـ IValueConverter، وقم بتعيين نقطة توقف في طريقة التحويل ومعرفة الارتفاع الذي يتم تعيينه عليه...

لا تنس إضافة المحول الخاص بك إلى الموارد الخاصة بك...

ربما تكون القيمة NaN ؟

حسنًا، إليك الصفقة:

في Silverlight، لا يمكنك ربط القيم من عنصر واجهة مستخدم إلى عنصر آخر بشكل تعريفي.الطريقة الوحيدة لفعل ما كنت أحاول القيام به هنا ستكون باستخدام كود C#.

كان لدي مرجع لهذا بالأمس، ولكن الآن أعتقد أنه سيتعين عليك فقط أن تصدق كلامي :)

حسنًا، قد يكون هناك اختلاف كبير بين WPF وSilverlight في هذه النقطة..

يبدو أنني لا أواجه أي مشكلة في تجميع هذه العينة وتشغيلها في نافذة WPF:

<Slider Width="400" Height="20">
    <Slider.Template>
        <ControlTemplate>
            <Border Name="TrackBackground"
                Margin="0"
                CornerRadius="2"                     
                Grid.Row="1"
                Grid.Column="1"
                Background="BlanchedAlmond"
                BorderThickness="1">

                <Canvas x:Name="PART_Track" Background="DarkSalmon" Grid.Row="1" Grid.Column="1">
                    <Thumb Name="ThumbKnob" Height="{Binding ElementName=PART_Track, Path=Height, Mode=OneWay}" />
                </Canvas>
            </Border>
        </ControlTemplate>
    </Slider.Template>
</Slider>

ربما يحتوي Silverlight على خصائص أقل في فئة Thumb...

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.thumb.aspx

أولا الأمر يتعلق بالغطاء..

يتغير

Part_Track
ل
PART_Track
والتي سوف إصلاح الخطأ الملزم الخاص بك ..

لكن لا أعتقد أن هذا ما تحاول فعله..

يمكنك استخدام الشبكة بدلاً من اللوحة القماشية، وسيتم تغيير حجم الإبهام تلقائيًا.القماش ليس له ارتفاع حقًا، فهو لا يهتم حقًا بطول أطفاله..

أتمنى أن يساعدك هذا...

هل الحدود في قالب راجع للشغل؟

لأنه ليست هناك حاجة لـ TemplateBinding إذا لم تكن الحدود موجودة في قالب (إما ControlTemplate أو DataTemplate)

يتضمن Silverlight 3 الآن ربط ElementName...

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