我的应用程序中有一个自定义控件。其中一个依赖属性是ObservableCollection<ToggleButton>
public ObservableCollection<ToggleButton> HeaderButtons
{
get { return (ObservableCollection<ToggleButton>)GetValue(HeaderButtonsProperty); }
set { SetValue(HeaderButtonsProperty, value); }
}
public static readonly DependencyProperty HeaderButtonsProperty = DependencyProperty.Register("HeaderButtons", typeof(ObservableCollection<ToggleButton>), typeof(Expandable), new PropertyMetadata(new ObservableCollection<ToggleButton>()));然后我将它们放在Generic.xaml的ListView中
<ListView ItemsSource="{TemplateBinding HeaderButtons}">
<ListView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListView.ItemsPanel>
</ListView>...and像这样使用它:
<controls:MyControl.HeaderButtons>
<ToggleButton x:Name="FilterButton">
<Image Source="/Assets/Icons/Empty Filter-512.png" Height="15" Width="15"/>
</ToggleButton>
</controls:MyControl.HeaderButtons>然而,我总是以重复的项目结束:

我不知道那个东西是怎么到那里的。我可以通过删除我的自定义ListView.ItemsPanel来修复它,但当然这会使我的项目垂直流动,从而破坏了整个目的。其他人能看到为什么这会复制这个项目吗?
编辑:为了引起更多的兴趣,如果我进入Live Visual Tree,我可以看到两个按钮的名称都是"FilterButton“。当然,这是不可能的。
编辑:这是来自MainWindow的ContentPresenter
<ContentPresenter Content="{Binding CurrentControl, Mode=OneWay}" Grid.Row="1" Grid.Column="1"/>并将CurrentControl设置为我的UserControl的一个实例
private UserControl currentControl;
public UserControl CurrentControl
{
get { return currentControl; }
set
{
if (currentControl != value)
{
currentControl = value;
OnPropertyChanged("CurrentControl");
}
}
}发布于 2016-06-04 12:59:38
问题的根源是您使用new PropertyMetadata(new ObservableCollection<ToggleButton>())设置的HeaderButtonsProperty的默认值。与您预期的相反,它不会为控件的每个实例创建集合的一个实例,而是在所有控件之间共享一个实例。
然后使用以下XAML语法:
<controls:MyControl.HeaderButtons>
<ToggleButton (...) />
</controls:MyControl.HeaderButtons>它不会将新集合分配给HeadersButton属性,而是将指定的项添加到现有项中。因此,每次“执行”这部分代码时,它都会将ToggleButton的新副本添加到由所有控件共享的单个集合中。
要解决这个问题,您应该从HeaderButtonsProperty的元数据中删除默认值,并在控件的构造函数中分配一个新的集合实例-这样,每个控件实例都将拥有自己的独立集合。
https://stackoverflow.com/questions/37622012
复制相似问题