我发现带有DataGrid CustomControl的xaml设计器有一种奇怪的行为。我有一个DependencyProperty:
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
"CustomizableColumns",
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable),
new PropertyMetadata(new ObservableCollection<DataGridColumn>()));
在XAML设计器中,我有以下代码:
<ctrl:DataGridCustomizable
<ctrl:DataGridCustomizable.CustomizableColumns>
... the columns
在重写方法中
protected override void OnInitialized(EventArgs e)
我将可自定义列放入DataGrid列(仅在设计模式下(
这是我的通知。XAML设计器的第一次打开,在新的构建之后,从CustomizableColumns中看不到任何内容。所以在OnInitialized方法中,没有添加任何列!
然后我关闭并重新打开XAML设计器,直到现在才知道CustomizableColumns,并且OnInitialized方法将CustomizableColumns放在DataGridColumns中。
你知道原因吗?感谢您的投入!
您不能通过属性元数据设置可变引用类型依赖属性的默认值。除非显式指定属性值,否则控件的所有实例都将使用相同的ObservableCollection<DataGridColumn>
对象。
您应该改为通过控件的构造函数中的SetCurrentValue
调用来设置默认值。
public static readonly DependencyProperty CustomizableColumnsProperty =
DependencyProperty.Register(
nameof(CustomizableColumns),
typeof(ObservableCollection<DataGridColumn>),
typeof(DataGridCustomizable));
...
public DataGridCustomizable()
{
SetCurrentValue(CustomizableColumnsProperty,
new ObservableCollection<DataGridColumn>());
}
使用SetCurrentValue
而不仅仅是SetValue
可以确保任何Binding、Style Setter或其他依赖属性值源仍然正常工作。