2017-02-07 4 views
0

In meiner WPF-App möchte ich mehrere Elemente haben, die vom Benutzer zur Laufzeit generiert werden. Diese stammen aus verschiedenen Klassen und daher bestand meine ursprüngliche Idee darin, sie verschiedenen Observable Collections hinzuzufügen und sie dann als ItemsSources verschiedener ItemsControls zu verwenden. WPF gibt mir jedoch den Fehler System.InvalidOperationException: Items-Auflistung muss leer sein, bevor ItemsSource verwendet. Ich bin kein WPF-Experte, aber die Antwort auf THIS SO Frage scheint darauf hinzuweisen, dass ich nur 1 ItemsControl haben kann.WPF: Kann ich mehrere ItemsControls mit verschiedenen ItemsSources haben?

THIS SO Frage zeigt an, dass ich vielleicht die CompositeCollection-Klasse verwenden sollte, aber anders als in der zitierten Frage habe ich mehrere völlig unterschiedliche Observable Collections für ganz andere Aufgaben.

Hier ist der relevante Teil meiner XAML.CS mit zwei Kollektionen: 1 von einem Typ benutzerdefinierte Schnittstelle und 1 von benutzerdefinierten Klassentyp

public MainWindow() 
    {   
     InitializeComponent();   
     DefaultWindowDefinition.ItemsSource = ProcessElements = new ObservableCollection<IProcessSimulator>(); 
     PathControl.ItemsSource = PathElements = new ObservableCollection<VisualPath>();   
    } 

Und hier ist der relevante Teil der XAML I zu verwenden versucht, :

<Grid   x:Name="MainGrid" 
       Background="{StaticResource Alternating}" 
       MouseLeftButtonUp="grid_MouseLeftButtonUp" 
       ShowGridLines="True"> 
    <ItemsControl Name="DefaultWindowDefinition" 
        ItemsSource="{Binding ProcessElements}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <!--HERE IS A LONG LIST OF ELEMENTS--> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <!--TEMPLATE FOR THE 1ST ITEMSCONTROL--> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <ItemsControl.ItemContainerStyle> 
      <Style> 
       <!--STYLE PROPERTIES FOR THE 1ST ITEMSCONTROL--> 
      </Style> 
     </ItemsControl.ItemContainerStyle> 
    </ItemsControl> 
    <ItemsControl Name="PathControl" 
        ItemsSource="{Binding PathElements}"> 
     <DataTemplate> 
      <!--HERE IS A LIST OF OTHER TYPE OFELEMENTS--> 
     </DataTemplate> 
    </ItemsControl> 
</Grid> 

Wie sollte ich dieses Problem angehen oder eher, welches C#/WPF-Element sollte ich verwenden? Eine Referenz und einige einfache Erklärungen sind mehr als genug, ich kann den Rest selbst googlen, ich weiß einfach nicht, wonach ich wirklich suchen soll.

+0

Eine Sache, die ich sehe, ist falsch, dass Sie 'ItemsSource' in XAML nicht binden müssen und es auch im Konstruktor setzen müssen. Es sollten nur die Elementeigenschaften ('ProcessElements' und' PathElements') ausreichen. Das könnte die Ausnahme verursachen. Wenn das nicht ist, welche Zeile löst die Ausnahme aus? – Andy

+0

Das war nicht die Ursache der Probleme, aber das Einstellen der ItemsSource _only_ im Code Behind scheint zu funktionieren, also vielen Dank, dass Sie darauf hingewiesen haben! – rTECH

Antwort

1

sollten Sie setzen die ItemTemplate Eigenschaft des „PathControl“ zu Ihrem Datatemplate:

<ItemsControl Name="PathControl" ItemsSource="{Binding PathElements}"> 
     <ItemsControl.ItemTemplate> <!-- NOTE THIS --> 
      <DataTemplate> 
       <!--HERE IS A LIST OF OTHER TYPE OFELEMENTS--> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

Wenn Sie das <ItemsControl.ItemTemplate> Element weglassen, den Sie hinzufügen, eine DataTemplate, um die Items Sammlung der ItemsControl und Sie können Setzen Sie auch nicht die Eigenschaft ItemsSource.

Der Versuch, dies zu tun, führt zu einer System.InvalidOperationException Ausnahme, die mit der Fehlermeldung, die Sie erhalten, ausgelöst wird.

Es ist vollkommen in Ordnung, wenn mehrere ItemsControl an dieselbe Quellensammlung bindet.

0

Es scheint, als ob Sie die ItemsSource zweimal einstellen. Einmal im Code hinter und einmal im XAML. Entfernen Sie den dahinter stehenden Code, legen Sie die Objektquelle fest und initialisieren Sie einfach die beobachtbaren Objektgruppen. Der XAML sollte sich um die Bindung an die Sammlungen kümmern.

+0

Nun, ich definiere es zweimal, einmal in Code hinter: PathControl.ItemsSource = PathElements = new ObservableCollection (); und einmal in XAML: ABER die lustige Sache ist, dass ich meine erste Observable-Sammlung die ** sehr gleiche ** Art und Weise ohne irgendwelche Fehler verwendet habe, erklärte ich einmal in Code Behind, dann einmal in XAML. In der Tat, wenn ich sie ** nur ** in XAML deklariere, funktioniert nichts. Dies könnte sehr gut mein VS sein, weil es XAML nicht einmal erkennt, also habe ich bisher ohne Farbcodierung gearbeitet ... Zeit für die Neuinstallation. – rTECH

Verwandte Themen