在我的CustomControl中,我有以下依赖属性:
public bool Favorite
{
get { return (bool)GetValue(FavoriteProperty); }
set { SetValue(FavoriteProperty, value); }
}
// Using a DependencyProperty as the backing store for Enabled. This enables animation, styling, binding, etc...
public static readonly DependencyProperty FavoriteProperty =
DependencyProperty.Register("Favorite", typeof(bool), typeof(FavoriteCustomControl), new PropertyMetadata(false, new PropertyChangedCallback(OnFavoriteChanged)));
private static void OnFavoriteChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e)
{
FavoriteCustomControl control = (FavoriteCustomControl) dependencyObject;
TextBlock textBlock = (TextBlock) control.GetTemplateChild(HeartPartName);
if (textBlock != null)
{
double opacity = ((bool)e.NewValue) ? 1 : 0.2;
textBlock.Opacity = opacity;
}
}
当我在窗口宣布时:
<custom:FavoriteCustomControl Grid.Row="1" Grid.Column="2" Margin="2" Favorite="true"/>
它在设计器视图中工作,但在我运行应用程序时却不行。我调试了最大限度,我只能抓住一件我认为可能是问题的东西:
OnFavoriteChanged
回调运行的时间非常多,但var textBlock
总是 null 。好吧并不总是因为在设计师模式中我看到不透明度发生了变化,所以var textBlock
不是空的。
我真的被卡住了,我不知道在哪里找错误/错误造成这种情况。
修改
现在我发现在OnFavoriteChanged
之前调用了OnApplyTemplate()
回调,我认为这就是textBlock
为空的原因。
答案 0 :(得分:1)
为什么不使用标准的WPF方法:
<TextBlock Opacity="{Binding Path=Favorite,
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type custom:FavoriteCustomControl}},
Converter={StaticResource BoolToOpacityConverter}}"/>
注意:您需要创建类BoolToOpacityConverter
并将其定义为资源。示例here。