我发现带有DataGrid-CustomControl的xaml Designer的奇怪行为。那里我有一个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)
我将CustomizableColumns放入DataGrid Columns(仅在DesignMode中)
现在这是我的通知。 XAML设计器的首次打开(经过新的构建)对CustomizableColumns没有任何感觉。因此,在OnInitialized方法中,不会添加任何列!
然后我关闭并重新打开XAML设计器,只有现在才知道CustomizableColumns,并且OnInitialized方法将CustomizableColumns放入DataGrid Columns。
您知道原因吗?感谢您的输入!
答案 0 :(得分:1)
不得通过属性元数据设置可变引用类型依赖项属性的默认值。除非您明确分配属性值,否则控件的所有实例都将使用相同的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或其他依赖项属性值源仍然可以正常工作。