0

我正在开发一个控件,ObservableCollection它的DependencyProperties. 此属性设置DefaultProperty为我的控件,因此我可以通过构造类似于以下内容的行将项目隐式添加到 XAML 中的集合中:

<MyControl>
    <MyItem/>
    <MyItem/>
    <MyItem/>
</MyControl>

据我了解,WPF 引擎在解析 XAML 时会构建逻辑树。因此,每个都MyItem应该是MyControl. 相反,MyControl应该是每个 的逻辑父级MyItem

好吧,显然还有更多。下面是我用来定义上述关系的代码。自定义控件包含一个DependencyPropertyforObservableCollection并且它由一个 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

4

1 回答 1

1

如果这是用于具有多个图形的图表控件,那么您肯定是在ItemsControl陆地上。您可能想看看您可以构建什么WPFToolkit或此处列出的其他工具之一:

https://stackoverflow.com/a/4227432/1869660

至于您的实际问题,如果您确实需要MyItem手动将 s 添加到您的逻辑树中,则需要调用 s AddLogicalChild(),例如在您的OnItemsChangedProperty事件中的某处。MSDN 上有一个例子。

于 2014-10-01T11:16:16.187 回答