【问题标题】:DependencyProperty dependencies and PropertyCallbacksDependencyProperty 依赖项和 PropertyCallbacks
【发布时间】:2010-08-05 20:14:04
【问题描述】:

本文中问题的核心是,您是否可以期望在设置其中一个的属性回调时设置所有 DP。我问这个是因为这不是我看到的行为。

一个类有两个 DP,都在 XAML 中设置,如下所示:

<!-- Days of the Week -->
<local:DayOfTheWeekColumn 
    DowIndex="0" 
    ActivityCollection="{Binding Source={StaticResource spy}, Path=DataContext}"
    ....                    
/>

在 DayOfTheWeekColumn 类中,DP 声明如下:

public static readonly DependencyProperty DowIndexProperty = DependencyProperty.RegisterAttached(
        "DowIndex", typeof(string), typeof(DayOfTheWeekColumn), 
        new PropertyMetadata(OnDowIndexSet), IsIndexValid);

    public static readonly DependencyProperty ActivityCollectionProperty = DependencyProperty.RegisterAttached(
        "ActivityCollection", typeof(IActivityCollectionViewModelBase), typeof(DayOfTheWeekColumn), 
        new PropertyMetadata(OnActivityCollectionSet));

当 OnDowIndexSet 回调执行时,ActivityCollectionProperty 仍然为 null,但是当 OnActivityCollectionSet 回调执行时,DowIndexProperty 被赋值。我需要这两个属性来完成这个用例。这是 OnActivityCollectionSet:

    private static void OnActivityCollectionSet(DependencyObject target, DependencyPropertyChangedEventArgs e) {
        var context = (IActivityCollectionViewModelBase) e.NewValue;
        var col = (DayOfTheWeekColumn) target;
        var index = Convert.ToInt32(col.DowIndex);
        _setHeader(col, context, index);
    }

现在这可行,但只要我不了解在回调执行时设置这两个属性的时间,它对我来说很脆弱。为什么这两个属性都可以用于 OnActivityCollectionSet 而不是 OnDowIndexSet?

干杯,
浆果

【问题讨论】:

    标签: wpf dependency-properties attached-properties


    【解决方案1】:

    可能在 XAML 中的 ActivityCollection 之前设置 DowIndex 之前?

    难道你不能使用默认的 DependencyProperty 值来防止这个问题吗?

    还有一点 OT 提示:Path 绑定属性是默认属性,因此您可以使用这个较短的符号:

    ActivityCollection="{Binding DataContext, Source={StaticResource spy}}"
    

    【讨论】:

    • re:XAML 排序。我也会这么想,但在这种情况下没关系; DowIndexProperty 总是首先获取它的值。我认为它没有理由这样做,但确实如此。
    • 默认依赖属性。你的意思是DataContext??如果是这样,则 DataGridColumn 不是 FrameworkElement,因此没有免费的。出于同样的原因,您也不能为其设置样式。我一直将其作为 DP 的子类来处理的主要原因之一
    • 重新语法。是的,你是对的,这是一个更具可读性的绑定。干杯
    • new PropertyMetadata(0, OnDowIndexSet) 将属性默认值设置为0。见msdn.microsoft.com/en-us/library/…
    • 哦,知道了。不,我需要在 xaml 中设置的值,所以默认值 0 在这里是非首发
    猜你喜欢
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多