문제

나는 단지 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);
            }
        }
    }
}

이것이 텍스트 블록을 실행할 때를 기대하고 있습니다. 숫자 20이 표시됩니다. 왜 이것이 작동하지 않는지에 대한 아이디어가 있습니까?

측면으로는 NumericStepperControl 어셈블리에 대한 심판이 포함 된 별도의 프로젝트가 있으며 컨트롤이 올바르게 구축되는 것 같습니다.

편집 ... 조금 더 조사한 후에는 값 속성의 유형을 잘 작동하는 문자열로 변경하면 알게되었습니다. 왜 텍스트 차단이 그 안에 전달 된 것에서 토스트 링을 호출하는 것이 아닌가? 내가 많이 일어나는 것을 볼 수있는 방법이 있습니까?

도움이 되었습니까?

해결책

약간의 파기 후 텍스트 블록이 실제로 전달 된 모든 것에서 Tostring을 호출하지 않는다는 것이 밝혀졌습니다.이 주위를 해결하려면 변환기를 사용하여 Tostring을 호출해야합니다.

문지름은 다음과 같습니다. TemplateBinding은 변환기를 지원하지 않습니다. 템플릿 결합을 Datacontext에 추가 한 다음 텍스트 속성에서 변환기와 함께 정상 바인딩을 사용해야합니다.

따라서 텍스트 블록 마크 업이됩니다

 <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