具有DependencyProperty的自定义控件的Designer行为

时间:2018-11-24 23:38:23

标签: c# wpf xaml dependency-properties

我发现带有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。

您知道原因吗?感谢您的输入!

1 个答案:

答案 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或其他依赖项属性值源仍然可以正常工作。