0

依存関係プロパティに従ってさまざまな形状を動的に生成するテンプレート コントロールが必要です。コントロールは次のようになります。

<Style TargetType="local:ColorShape">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:ColorShape">
                <ContentControl x:Name="shapeParent">
                </ContentControl>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

形状の依存性プロパティがあります: public ShapeType

ShapeType
{
    get { return (ShapeType)GetValue(ShapeTypeProperty); }
    set { SetValue(ShapeTypeProperty, value); }
}

public static readonly DependencyProperty ShapeTypeProperty =
    DependencyProperty.Register("ShapeType", typeof(ShapeType), typeof(ColorShape), new PropertyMetadata(ShapeType.Circle));

OnApplyTemplateメソッドで形状を生成します。

protected override void OnApplyTemplate()
{
    var shapeParent = (ContentControl)this.GetTemplateChild("shapeParent");
    var shape = GetShape(ShapeType);
    shapeParent.Content = shape;

    base.OnApplyTemplate();
}

プロパティを DataBind でき、コントロールを初めて作成したときに機能します。

<Controls:ColorShape Grid.Row="1" Width="200" Height="200" Stroke="Black" ShapeType="{x:Bind ViewModel.Shape, Mode=OneWay}" StrokeThickness="5" Fill="{x:Bind ViewModel.Color, Mode=OneWay}" />

しかし、ViewModel でバインドされたプロパティを変更すると、INotifyPropertyChange通知が生成されますが、テンプレート コントロールは再描画されません。

テンプレート コントロールの依存関係プロパティにコールバックを追加しようとしましたが、プロパティにバインドされた新しい値 (この場合は ) で依存関係プロパティが更新されていることがわかりますがViewModel.Shape、UI は更新されません (再度呼び出すことはありません)。OnApplyTemplate)。ApplyTemplateメソッドを手動で呼び出そうとしましたが、イベントOnApplyTemplateが発生しません。

4

1 に答える 1