2016-06-30 6 views
0

Ich habe eine ObservableCollection mit einer variablen Anzahl von Elementen. Ich zeige jedes Element in einem Text innerhalb einer List-Box:Überspringe das erste Objekt von ObservableCollection

<ListBox ItemsSource="{Binding Collection, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
<ListBox.ItemTemplate> 
     <DataTemplate> 
       <TextBox Label="{Binding Title}"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 

Jetzt habe ich das erste Element des ObservableCollection überspringen will. Ich weiß, dass ich das in meinem ViewModel machen kann/sollte, aber ich würde gerne wissen, ob dies eine XAML-Methode ist. Etwas wie:

<ListBox ItemsSource="{Binding Collection.Skip(0), Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"> 
... 
+1

Als Hinweis, die Option 'Mode = TwoWay' und' Update = PropertyChanged' nicht sinnvoll, wenn die 'ItemsSource' Eigenschaft Bindung: Sie würden auch einen ausreichend großen Wert für die AlternationCount Eigenschaft müssen. Das Steuerelement ändert diese Eigenschaft nie. – Clemens

+0

Ja, Sie haben Recht. Es ist nur ein Beispiel, das ich aus verschiedenen Code-Stücken zusammensetze, um mein Problem auf einfache Weise zu zeigen. Ich habe vergessen, diesen Teil der Bindung zu löschen. – L4c0573

Antwort

1

Sie könnten einen ListBoxItem basierend auf seinem Index ausblenden, indem Sie einen Trigger auf seine beigefügte Eigenschaft AlternationIndex setzen. hat

<ListBox ItemsSource="{Binding Collection}" AlternationCount="2147483647"> 
    <ListBox.ItemContainerStyle> 
     <Style TargetType="ListBoxItem"> 
      <Style.Triggers> 
       <Trigger Property="ItemsControl.AlternationIndex" Value="0"> 
        <Setter Property="Visibility" Value="Collapsed"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </ListBox.ItemContainerStyle> 
    ... 
</ListBox> 
+0

Sieht aus wie schnell und schmutzig. Aber das habe ich erwartet :). Funktioniert gut, danke. Aber was ist dieser AlternationCount, und warum muss ich einen so großen Wert festlegen? – L4c0573

+0

Okay ich habe es. In diesem Fall wäre jeder 2147483647. Artikel kollabiert. Wenn ich AlternationCount auf 2 setzen würde, wäre jedes zweite Element Collapsed. Recht? – L4c0573

1

Der direkteste Weg ist 2 Eigenschaften:

List<Item> _list = new List<Item>(); 

public ObservableCollection<Item> Collection => new ObservableCollection<Item>(_list); 

public ObservableCollection<Item> Collection2 => 
    new ObservableCollection<Item>(_list.Skip(0)); 

Diese beobachtbaren Sammlungen werden nur in der Ansicht existiert (bindend wird, sobald Eigenschaft Getter nennen, die Schaffung ObservableCollection für jede Eigenschaft).

Wenn Sie _list ändern, dann benachrichtigen, was beide Eigenschaften geändert werden Ansicht zu aktualisieren:

_list.Add(new Item()); 
OnPropertyChanged(nameof(Collection)); 
OnPropertyChanged(nameof(Collection2)); 

Ich glaube nicht, dass Sie etwas anderes im gegebenen Fall tun. Z.B. disabling item oder machen Sie eine andere Änderung an, wie Artikel mit Artikelvorlage angezeigt wird, ist möglich, aber vollständig entfernen Artikel ... glaube nicht. Zumindest wird nicht einfach sein (eigene ContainerTemplate Art, um das erste Element zu überspringen?).

S.S .: vielleicht implementieren eigene ObservableCollection<>, die nicht (aber verwendet die gleiche Quelle in jedem Fall) ist eine gute Idee, hängt von der Größe der Sammlung. Dann können Sie eigene Regeln für Iteratoren implementieren (z. B. Eigenschaft, die das erste Element überspringt).