自定义控件依赖属性不起作用

时间:2013-04-27 17:02:59

标签: c# .net xaml custom-controls

在我的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为空的原因。

1 个答案:

答案 0 :(得分:1)

为什么不使用标准的WPF方法:

<TextBlock Opacity="{Binding Path=Favorite, 
    RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type custom:FavoriteCustomControl}}, 
    Converter={StaticResource BoolToOpacityConverter}}"/>

注意:您需要创建类BoolToOpacityConverter并将其定义为资源。示例here