首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置ListView ItemsPanel重复项目

设置ListView ItemsPanel重复项目
EN

Stack Overflow用户
提问于 2016-06-04 03:26:09
回答 1查看 177关注 0票数 1

我的应用程序中有一个自定义控件。其中一个依赖属性是ObservableCollection<ToggleButton>

代码语言:javascript
复制
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.xamlListView

代码语言:javascript
复制
<ListView ItemsSource="{TemplateBinding HeaderButtons}">
    <ListView.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
       </ItemsPanelTemplate>
   </ListView.ItemsPanel>
</ListView>

...and像这样使用它:

代码语言:javascript
复制
<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“。当然,这是不可能的。

编辑:这是来自MainWindowContentPresenter

代码语言:javascript
复制
<ContentPresenter Content="{Binding CurrentControl, Mode=OneWay}" Grid.Row="1" Grid.Column="1"/>

并将CurrentControl设置为我的UserControl的一个实例

代码语言:javascript
复制
private UserControl currentControl;
public UserControl CurrentControl
{
    get { return currentControl; }
    set
    {
        if (currentControl != value)
        {
            currentControl = value;
            OnPropertyChanged("CurrentControl");
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2016-06-04 12:59:38

问题的根源是您使用new PropertyMetadata(new ObservableCollection<ToggleButton>())设置的HeaderButtonsProperty的默认值。与您预期的相反,它不会为控件的每个实例创建集合的一个实例,而是在所有控件之间共享一个实例。

然后使用以下XAML语法:

代码语言:javascript
复制
<controls:MyControl.HeaderButtons>
    <ToggleButton (...) />
</controls:MyControl.HeaderButtons>

它不会将新集合分配给HeadersButton属性,而是将指定的项添加到现有项中。因此,每次“执行”这部分代码时,它都会将ToggleButton的新副本添加到由所有控件共享的单个集合中。

要解决这个问题,您应该从HeaderButtonsProperty的元数据中删除默认值,并在控件的构造函数中分配一个新的集合实例-这样,每个控件实例都将拥有自己的独立集合。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37622012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档