0

在我的 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就是 null 的原因。

4

1 回答 1

1

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

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

注意:您需要创建类BoolToOpacityConverter并将其定义为资源。这里的例子。

于 2013-04-27T17:45:20.460 回答