如何在自定义StackPanel中为特定的自定义控件创建项目列表
本文关键字:自定义控件 创建 列表 项目 自定义 StackPanel | 更新日期: 2023-09-27 17:59:39
我想创建一个从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,如果我添加项目,它会非常有效。intellisense也只显示了一个可以添加的MyControl。
现在,如何从集合中获取列表并将其添加到StackPanel,即使用stkPanel。儿童Add()。
我应该使用Panel吗?或者如何获取列表并添加到Panel?提前谢谢。
PS:我尝试了几个选项,但列表总是空的,包括使用ItemsControl。所以我可能遗漏了一些要点。再次使用ItemsControl不适合我的场景,因为我只想要一个可以添加到面板中的控件类型。
使用ObservableCollection
的collection changed事件来保持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>