2016-06-03 3 views
1

내 응용 프로그램에 사용자 지정 컨트롤이 있습니다. 종속성 속성 중 하나 인 ObservableCollection<ToggleButton> : 나는 다음 ListViewGeneric.xaml에서 그들을두고있어ListView ItemsPanel 중복 항목 설정

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>())); 

:

<ListView ItemsSource="{TemplateBinding HeaderButtons}"> 
    <ListView.ItemsPanel> 
     <ItemsPanelTemplate> 
      <VirtualizingStackPanel Orientation="Horizontal"/> 
     </ItemsPanelTemplate> 
    </ListView.ItemsPanel> 
</ListView> 

...이처럼 사용 :

<controls:MyControl.HeaderButtons> 
    <ToggleButton x:Name="FilterButton"> 
     <Image Source="/Assets/Icons/Empty Filter-512.png" Height="15" Width="15"/> 
    </ToggleButton> 
</controls:MyControl.HeaderButtons> 

그러나 중복 된 항목으로 계속 끝납니다 :

Duplicate item

해당 항목이 어떻게 전달되는지 알 수 없습니다. 나는 나의 주문 ListView.ItemsPanel을 제거함으로써 그것을 고칠 수있다. 그러나 물론 그것은 나의 목적을 수직으로 흐르게하여 전체 목적을 이겨낸다. 이 항목을 복제하는 이유를 다른 사람이 볼 수 있습니까?

EDIT : 추가 관심 사항으로, 라이브 비쥬얼 트리에 들어가면 두 버튼의 이름이 모두 "FilterButton"임을 알 수 있습니다. 물론 어느 것이 가능하지 않아야합니다.

편집 : 여기에서 ContentPresenter을 년대 MainWindow :

private UserControl currentControl; 
public UserControl CurrentControl 
{ 
    get { return currentControl; } 
    set 
    { 
     if (currentControl != value) 
     { 
      currentControl = value; 
      OnPropertyChanged("CurrentControl"); 
     } 
    } 
} 
+0

이상한. 나는 단지 이미지가 유일한 차이점을 가지고 당신의 코드를 테스트했고, 단지 하나의 이미지 만 보여줍니다. – SWilko

+0

거기에 다른 ToggleButton을 던지면 어떻게됩니까? 4 아이템? – SWilko

+0

@SWilko Strange ... 더 자세한 내용은'MainWindow'에서'ContentPresenter' 내부에서 호스팅되는'UserControl' 내부의 컨트롤을 활용하고 있습니다. 네, 4 가지 항목이 있습니다. – RareNCool

답변

2

문제의 원인이 HeaderButtonsProperty의 기본값은 다음과 같습니다

<ContentPresenter Content="{Binding CurrentControl, Mode=OneWay}" Grid.Row="1" Grid.Column="1"/> 

그리고 CurrentControlUserControl의 인스턴스로 설정 - new PropertyMetadata(new ObservableCollection<ToggleButton>())을 사용하여 설정합니다. 예상했던 것과는 달리 컨트롤의 각 인스턴스에 대해 컬렉션 인스턴스 하나를 만들지 않고 모든 컨트롤에 대해 단일 인스턴스를 공유합니다.

그런 다음이 XAML 구문을 사용합니다

<controls:MyControl.HeaderButtons> 
    <ToggleButton (...) /> 
</controls:MyControl.HeaderButtons> 

당신의 HeadersButton 속성에 새 컬렉션을 할당하지 않고, 오히려 기존에 지정된 항목을 추가합니다. 따라서이 코드 부분이 "실행"될 때마다 모든 컨트롤에서 공유하는 단일 컬렉션에 ToggleButton의 새 복사본을 추가합니다.

HeaderButtonsProperty의 메타 데이터에서 기본값을 제거하고 컨트롤의 생성자에 새 컬렉션 인스턴스를 할당해야합니다. 즉, 각 컨트롤 인스턴스에는 자체 컬렉션이 있습니다.