سؤال

أنا فقط مدس حول عناصر تحكم مخصصة في Silverlight وعلى حياة لي لا أستطيع الحصول على templateBindings للعمل. هل يمكن لشخص ما أن يمنح هذه النسخة المخفضة مرة واحدة لمعرفة ما إذا كنت أفتقد شيئا ما.

لذلك تحكم بلدي في generic.xaml يبدو

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:NumericStepperControl;assembly=NumericStepperControl">
    <Style TargetType="local:NumericStepper">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:NumericStepper">
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition />
                            <ColumnDefinition />
                        </Grid.ColumnDefinitions>

                        <Border Grid.Column="0" BorderBrush="Black" BorderThickness="2"  Width="50" Height="30">
                            <TextBlock Width="50" Height="30" Text="{TemplateBinding Value}" />
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>        
        </Setter>
    </Style>
</ResourceDictionary>

وكأن فئة الرقابة الخاصة بي

namespace NumericStepperControl
{
    public class NumericStepper : Control
    {
        public static readonly DependencyProperty ValueProperty = DependencyProperty.Register("Value", typeof(int), typeof(NumericStepper), new PropertyMetadata(20));

        public NumericStepper()
            : base()
        {
            DefaultStyleKey = typeof( NumericStepper );
        }

        public int Value
        {
            get
            {
                return (int)GetValue(ValueProperty);
            }
            set
            {
                SetValue(ValueProperty, value);
            }
        }
    }
}

أتوقع عندما يدير هذا سيتم عرض TextBlock الرقم 20. أي أفكار لماذا لا يعمل هذا؟

كجانب ليس لدي مشروع منفصل يحتوي على إعادة المرجع إلى تجميع numericsteppercontrol وعندما يدير عناصر التحكم يبدو أن تبني بشكل صحيح.

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

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

المحلول

بعد قليل من الحفر، اتضح أن TextBlock لا يتصل في الواقع على Tostring على أي شيء يتم تمريره. للتغلب على هذا يجب عليك استخدام محول لاستدعاء ToString لك.

إليكم الفرك على الرغم من أن TemplateBinding لا يدعم المحولات. يجب عليك إضافة templateBinding إلى DataContext ثم استخدم الربط العادي في خاصية النص مع المحول.

لذلك تصبح ترميز TextBlock

 <TextBlock Width="50" Height="30" DataContext="{TemplateBinding Value}"  Text="{Binding Converter={StaticResource NumberTypeToStringConverter}}" />

محول مخصص الخاص بي:

public class NumberTypeToStringConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
            {
                throw new NullReferenceException();
            } 

            return value.ToString(); 
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            MethodInfo methodInfo = targetType.GetMethod("Parse");

            if (methodInfo == null)
            {
                throw new MissingMethodException("The targetType to convert back to a Number must implement a Parse method");
            }

            return methodInfo.Invoke(null, new object[] { value });
        }
    }

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

هتافات

نصائح أخرى

هناك أساليب مختلفة للحصول على مشكلة حول المشكلة.وجدت هذا الوصف بواسطة marek latuskiewicz.

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