在ValidateValueCallback之后,DependencyProperty不传递值

时间:2019-02-01 23:30:12

标签: c# wpf xaml

我有一个带有自定义控件(MyControl)的库(WpfLibrary),该控件也具有默认样式(Themes \ Generic.xaml)。 自定义控件工作正常,并且正确应用了默认样式。问题出在MyControl内部的依赖项属性上,该依赖项属性是一种List类型,无法通过默认样式(Themes \ Generic.xaml)进行设置。在我为MyControl发布代码的下面,您可以看到我在ctor中设置依赖项属性。需要那是因为我不能在功能DependencyProperty.Register设置(该清单将MyControl的多个实例之间共享)。而且,如果我不设置新的List并保留null,则用户将在访问null依赖项属性时获得null异常。

public class MyControl : FrameworkElement
{
    static MyControl()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(MyControl), new FrameworkPropertyMetadata(typeof(MyControl)));
    }

    public MyControl()
    {
        // Setting the default value of the dependency property.
        // I need that set, otherwise users of MyControl will get null exception
        Objects = new List<object>();
    }


    public List<object> Objects
    {
        get { return (List<object>)GetValue(ObjectsProperty); }
        set { SetValue(ObjectsProperty, value); }
    }
    public static readonly DependencyProperty ObjectsProperty =
        DependencyProperty.Register(nameof(Objects), typeof(List<object>), typeof(MyControl), new PropertyMetadata(null, ObjectsChanged, ObjectsCoerceValue), ObjectsValidateValue);

    // Both the ctor and default style Lists are beeing passed here
    private static bool ObjectsValidateValue(object value)
    {
        return true;
    }

    // Only the ctor List is passed here
    private static object ObjectsCoerceValue(DependencyObject d, object baseValue)
    {
        return baseValue;
    }

    // Only the ctor List is passed here
    private static void ObjectsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
    }
}

正如我所说,我在2个地方设置了List Objects属性,第二个是默认样式(Themes \ Generic.xaml)。

<Style TargetType="{x:Type local:MyControl}">        
    <Setter Property="Objects">
        <Setter.Value>
            <local:ObjectsCollection>
                <TextBlock />
                <TextBlock />
                <TextBlock />
            </local:ObjectsCollection>
        </Setter.Value>
    </Setter>
</Style>

具有3个元素的集合仅被调用到ValidateValueCallback,但没有通过该点。 CoarceValueCallback和PropertyChangedCallback不被3元素列表调用。这也意味着,该属性值保持为空的列表对象。 注意:默认样式的local:ObjectsCollection是从List继承的简单类。 我张贴整个项目,但并不多。我尝试了很多事情,并搜索了50%的google:P无法找到答案, 如何从默认样式(Themes \ Generic.xaml)设置集合。 WpfApplication15.7z

0 个答案:

没有答案