カスタムコントロールでTemplateBindings
-
09-09-2019 - |
質問
私は、Silverlightでカスタムコントロールしながら約いじくることだし、私の人生のために私はTemplateBindingsを動作させることはできません。誰かが私は何かが欠けてるかどうかを確認するために一回以上、この縮小版を与えることができます。
だから、generic.xamlの私のControlTemplateは、
のようになります。<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アセンブリへの参照が含まれている別のプロジェクトを持っており、それが実行時にコントロールが正しく構築するようです。
の編集...もう少し調査をした後、私は正常に動作します文字列にValueプロパティのタイプを変更した場合ことを発見しました。なぜテキストブロックはそれに渡されているものに対してtoStringを呼び出すことはありませんか?私はそれは多くのことを起こって見ることができるようにこのラウンド方法はありますか?の
解決
それを掘るのビットは、TextBlockには、実際に渡されているものでToStringメソッドを呼び出していないこと。これを回避するには、あなたがあなたのためのToStringメソッドを呼び出すためのコンバーターを使用する必要がありますが判明した後ます。
ここで摩擦がしかしだ、TemplateBindingのは、コンバータをサポートしていません。あなたはDataContextのにTemplateBindingのを追加し、コンバータと一緒に、Textプロパティに通常のバインディングを使用する必要があります。
の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 });
}
}
これは、周りの仕事のビットのように思えるし、私はそれが不利な影響を持っている場合は聞いて興味があると思います。また、誰もがこれを読んでいると私のコンバータに何か問題があるなら、私に教えてくださいます。
乾杯
他のヒント
問題arroundの取得するためのさまざまなアプローチがあります。 これを見つけましたマレクLatuskiewiczするによる記述ます。