2017-02-07 4 views
0

В моем приложении WPF я хочу иметь несколько элементов, которые генерируются пользователем во время выполнения. Это из разных классов, и поэтому моя первоначальная идея заключалась в том, чтобы добавить их в разные Observable Collections, а затем использовать их как ItemsSources od different ItemsControls. Однако WPF дает мне ошибку System.InvalidOperationException: коллекция элементов должна быть пустой перед использованием ItemsSource. Я не эксперт WPF, но ответ на вопрос THIS Вопрос, похоже, указывает, что я могу иметь только 1 ItemsControl.WPF: Могу ли я иметь несколько ItemsControls с различными ItemsSources?

THIS Вопрос SO указывает, что, возможно, я должен использовать класс CompositeCollection, но, в отличие от цитируемого вопроса, у меня есть несколько совершенно разных Observable Collections для совершенно разных задач.

Вот соответствующая часть моего XAML.CS с два Collections: 1 типа пользовательского интерфейса и 1 типа пользовательского класса

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

А вот соответствующая часть XAML я пытался использовать :

<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> 

Как я должен подходить к этой проблеме или, вернее, использовать элемент C#/WPF? Ссылка и некоторые слова простого объяснения более чем достаточно, я могу сам остальное, я просто не знаю, что искать на самом деле.

+0

Одна вещь, я вижу, что это неправильно, так это то, что вам не нужно связывать 'ItemsSource' в XAML, а также устанавливать его в конструкторе. Необходимо установить только свойства элемента ('ProcessElements' и' PathElements'). Это может вызвать исключение. Если это не так, какая строка выбрасывает исключение? – Andy

+0

Это не было источником проблем, но установка ItemsSource _only_ в Code Behind, похоже, сработала, поэтому спасибо, что указали это! – rTECH

ответ

1

Вы должны установить ItemTemplate свойство «PathControl» на ваш DataTemplate:

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

Если опустить <ItemsControl.ItemTemplate> элемент, вы добавляете DataTemplate к Items коллекцию ItemsControl, и вы можете 't также установить его ItemsSource собственности.

Попытка сделать это приведет к возникновению исключения System.InvalidOperationException с сообщением об ошибке, которое вы получаете.

Это идеальное решение для нескольких элементов управления ItemsControl для того же источника.

0

Кажется, что вы дважды устанавливаете ItemsSource. Однажды в коде позади и один раз в XAML. Удалите код, который устанавливает источник Items и просто инициализирует наблюдаемые коллекции. XAML должен позаботиться о привязке к коллекциям.

+0

Ну, я определяю его дважды, один раз в Code Behind: PathControl.ItemsSource = PathElements = new ObservableCollection (); и один раз в XAML: Но забавно, что я использовал свою первую коллекцию Observable ** очень точно ** без ошибок, я объявил один раз в Code Behind, затем один раз в XAML. На самом деле, если я объявляю их **, только ** в XAML ничего не работает. Это вполне может быть моим VS, потому что он даже не распознает XAML, поэтому я работал без цветового кодирования до сих пор ... Время переустановки. – rTECH