依存関係プロパティに従ってさまざまな形状を動的に生成するテンプレート コントロールが必要です。コントロールは次のようになります。
<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
が発生しません。