사용자 정의 컨트롤의 템플릿 결합
-
09-09-2019 - |
문제
나는 단지 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 의이 설명을 찾았습니다.