我有一个带有自定义控件(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