我正在开发一个控件,ObservableCollection
它的DependencyProperties
. 此属性设置DefaultProperty
为我的控件,因此我可以通过构造类似于以下内容的行将项目隐式添加到 XAML 中的集合中:
<MyControl>
<MyItem/>
<MyItem/>
<MyItem/>
</MyControl>
据我了解,WPF 引擎在解析 XAML 时会构建逻辑树。因此,每个都MyItem
应该是MyControl
. 相反,MyControl
应该是每个 的逻辑父级MyItem
。
好吧,显然还有更多。下面是我用来定义上述关系的代码。自定义控件包含一个DependencyProperty
forObservableCollection
并且它由一个 CLR 属性支持。
[ContentProperty("Items")]
public class MyControl : Control
{
public static readonly DependencyProperty ItemsProperty = DependencyProperty.Register(
"Items",
typeof(ObservableCollection<MyItem>),
typeof(MyControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsRender, OnItemsChangedProperty));
[Category("MyControl")]
public ObservableCollection<MyItem> Items
{
get { return (ObservableCollection<MyItem>)GetValue(ItemsProperty); }
set { SetValue(ItemsProperty, value); }
}
public MyControl() : base()
{ //Set a new collection per control, but don't destroy binding.
SetCurrentValue(ItemsProperty, new ObservableCollection<MyItem>());
}
}
从MyItem
(继承FrameworkContentElement
)开始,我尝试像这样访问它的逻辑父级:
if (Parent is FrameworkElement)
{ //Re-Render the parent control.
((FrameworkElement)Parent).InvalidateVisual();
}
令我惊讶的是,父控件永远不会重新呈现。这是因为该MyItem.Parent
属性为空。为什么是这样?
我如何指示 WPF 引擎知道它MyControl
应该是逻辑父级MyItem
?