当依赖项 属性 更改时更新 UWP 模板控件中的 UI
Update UI in UWP Template Control when dependency property changes
我想要根据依赖项动态生成不同形状的模板控件 property.The 控件如下所示:
<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
{
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
从未被触发。
OnApplyTemplate
仅在生成模板时调用一次。它只会在您更改控件上的模板时再次调用。
您需要的是 DependencyProperty 上的 PropertyChangedCallback
:
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0, OnPropertyChanged);
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Do what you need here
}
(您缺少的部分是 new PropertyMetadata(...)
处的第二个参数。
我想要根据依赖项动态生成不同形状的模板控件 property.The 控件如下所示:
<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
{
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
从未被触发。
OnApplyTemplate
仅在生成模板时调用一次。它只会在您更改控件上的模板时再次调用。
您需要的是 DependencyProperty 上的 PropertyChangedCallback
:
public int MyProperty
{
get { return (int)GetValue(MyPropertyProperty); }
set { SetValue(MyPropertyProperty, value); }
}
public static readonly DependencyProperty MyPropertyProperty =
DependencyProperty.Register("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0, OnPropertyChanged);
private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
// Do what you need here
}
(您缺少的部分是 new PropertyMetadata(...)
处的第二个参数。