在UI渲染后执行附加属性

时间:2012-02-27 13:14:40

标签: wpf attached-properties

我在UI上有一个文本块,它通过使用绑定源从Resource文件中填充。现在我附加了依赖属性类型bool,它检查是否为true然后它连接"(*)"签到文本块。

但是在运行时,当屏幕加载时,附加的proeprty会在文本从资源文件中绑定之前先执行,并且由于附加属性添加的这个符号会被绑定覆盖。

依赖性Proerty

public static readonly DependencyProperty IsRequiredProperty = DependencyProperty.RegisterAttached("IsRequired", typeof(bool), typeof(RequiredIndicator),
        new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsParentArrange, OnIsRequiredChanged));

XAML

<TextBlock Text="{Binding Source={x:Static Resources:Resource.ColorTextBlockText}}" Grid.Column="1" Grid.Row="5"
                   Style="{StaticResource AdminScreenTextBlockStyle}" Resources:RequiredIndicator.IsRequired="True" />

3 个答案:

答案 0 :(得分:1)

为什么不使用Converter

您不想修改绑定值,否则您的实际数据值将在其末尾包含(*),否则绑定将丢失。转换器只需转换绑定值即可在末尾添加(*),仅用于显示目的。

<TextBlock Text="{Binding 
               Source={x:Static Resources:Resource.ColorTextBlockText}, 
               Converter={StaticResource RequiredIndicatorConverter}" 
           Grid.Column="1" Grid.Row="5"
           Style="{StaticResource AdminScreenTextBlockStyle}" />

否则,您可以尝试使用Dispatcher来运行代码DispatcherPriority而不是DispatcherPriority.Render

答案 1 :(得分:0)

您无法以“正确”的顺序强制更新内容。您最好的选择是添加另一个附加属性,例如:

public static readonly DependencyProperty MyTextProperty = DependencyProperty.RegisterAttached("MyText", typeof(string), typeof(RequiredIndicator),
        new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsParentArrange, OnIsRequiredChanged));

然后,您将使用IsRequiredPropertyMyTextProperty的组合来设置TextBlock.TextProperty。然后,您将MyTextProperty设置为资源。

答案 2 :(得分:0)

如果我说得对,你试图改变从资源收到的文本,但是Text属性的代码在资源:RequiredIndicator.IsRequired =“True”之前执行。 这种情况有时会发生在我身上,并且可以通过在XAML中安排属性来解决它。这不是首选方法,因为它并不总是保证工作。 似乎转换器可以完成魔术,因为有必要在Text属性获取值之前先执行。