0

我想创建一个从 StackPanel 派生的自定义 StackPanel。但要添加项目,我想创建一个特殊列表(可以使用 List<> 或 ObservableCollection<>)。应该是这样的

<mc:MyStackPanel>
  <mc:MyStackPanel.Items>
    <mc:MyControl Content="A" />
    <mc:MyControl Content="B" />
    <mc:MyControl Content="C" />
  </mc:MyStackPanel.Items>
</mc:MyStackPanel>

不像这样(目前这个正在工作),

<mc:MyStackPanel>
   <mc:MyControl Content="A" />
   <mc:MyControl Content="B" />
   <mc:MyControl Content="C" />
</mc:MyStackPanel>

我尝试使用 ObservableCollection,如果我添加项目,它会完美运行。智能感知也只显示了一个可以添加的 MyControl。

现在,如何从集合中获取列表并将其添加到 StackPanel,即使用 stkPanel.Children.Add()。

我应该改用 Panel 还是如何获取列表并添加到 Panel 中?提前致谢。

PS:我尝试了几个选项,但列表始终为空,包括使用 ItemsControl。所以可能我在这里遗漏了一些观点。再次使用 ItemsControl 不适合我的场景,因为我只想要一种可以添加到面板的控件类型。

4

1 回答 1

0

如何使用 的集合更改事件ObservableCollection来保持Children属性同步?我还包含了该ContentProperty属性,因此您不必在 XAML 中将项目显式添加到集合中,如果您愿意,可以将其删除。

[ContentProperty("CustomItems")]
public class MyCustomStackPanel : StackPanel
{
    public MyCustomStackPanel()
    {
        CustomItems = new ObservableCollection<MyUserControl>();
    }

    private void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        if (e.NewItems != null)
        {
            foreach (object element in e.NewItems)
            {
                Children.Add((UIElement) element);
            }
        }

        if (e.OldItems != null)
        {
            foreach (object element in e.OldItems)
            {
                Children.Remove((UIElement)element);
            }
        }
    }

    private ObservableCollection<MyUserControl> _customItems;
    public ObservableCollection<MyUserControl> CustomItems
    {
        get { return _customItems; }
        set
        {
            if(_customItems == value)
                return;

            if (_customItems != null)
                _customItems.CollectionChanged -= OnCollectionChanged;

            _customItems = value;

            if (_customItems != null)
                _customItems.CollectionChanged += OnCollectionChanged;
        }
    }
}

XAML 然后看起来像这样(本地命名空间指向自定义控件所在的项目)

<local:MyCustomStackPanel>
    <local:MyUserControl></local:MyUserControl>
</local:MyCustomStackPanel>
于 2013-02-17T13:27:00.707 回答