具有DependencyProperty的自定义控件的设计器行为



我发现带有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或其他依赖属性值源仍然正常工作。

相关内容

  • 没有找到相关文章

最新更新