2017-02-07 38 views
0

내 WPF 응용 프로그램에서 런타임에 사용자가 생성 한 여러 항목을 갖고 싶습니다. 이것들은 다른 클래스에서 왔기 때문에 원래의 관념은 그들을 다른 Observable Collections에 추가 한 다음 다른 ItemsControls를 ItemsSources로 사용하는 것이 었습니다. 그러나 WPF 내게 오류 System.InvalidOperationException : ItemsSource를 사용하기 전에 항목 컬렉션이 비어 있어야합니다. 저는 WPF 전문가가 아니지만 THIS SO 질문에 대한 대답은 ItemsControl이 1 개 밖에 없다는 것을 나타냅니다.WPF : ItemsSources가 다른 여러 ItemsControl을 가질 수 있습니까?

THIS 질문에 따라 CompositeCollection 클래스를 사용해야하지만 인용 된 질문과 달리 완전히 다른 작업을 위해 Observable Collections가 완전히 다릅니다. 사용자 정의 인터페이스 유형 1 및 사용자 정의 클래스 유형

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

을 1 그리고 여기 내가 사용하려고 한 XAML의 관련 부분입니다 : 여기

두 컬렉션 내 XAML.CS의 관련 부분입니다 :

<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

내가 잘못 본 것 중에 하나는 XAML에서'ItemsSource'를 바인딩 할 필요가 없으며 생성자에서도 설정할 수 있다는 것입니다. 멤버 속성 ('ProcessElements' 및'PathElements') 만 설정하면 충분합니다. 그 예외가 발생할 수 있습니다. 그렇지 않은 경우 어떤 라인에서 예외가 발생합니까? – Andy

+0

그게 문제의 근원은 아니지만 코드 숨김에서 ItemsSource _only_를 설정하는 것 같습니다. 이것을 지적 해 주셔서 감사합니다! – rTECH

답변

1

당신은 당신의 DataTemplate에 "PathControl"의 ItemTemplate을 속성을 설정해야합니다 : 당신이 <ItemsControl.ItemTemplate> 요소를 생략하면

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

, 당신은 ItemsControlDataTemplateItems 모음을 추가하고 당신은 할 수 ItemsSource 속성도 설정합니다.

이렇게하면 오류 메시지가 표시되어 System.InvalidOperationException 예외가 throw됩니다.

동일한 Items 컬렉션에 여러 ItemsControl을 바인딩해도 괜찮습니다.

0

ItemsSource를 두 번 설정하는 것처럼 보입니다. 한 번은 코드 뒤에, XAML에는 한 번. Items 소스를 설정하고 관찰 가능 콜렉션을 초기화하는 코드를 제거하십시오. XAML은 컬렉션에 바인딩을 처리해야합니다.

+0

글쎄, 내가 코드를 한 번 두 번, 뒤에 정의 : PathControl.ItemsSource = PathElements = new ObservableCollection (); XAML에서 한 번 : 하지만 재미있는 점은 처음 Observable 컬렉션을 ** 오류없이 동일한 ** 방법으로 사용했다는 것입니다. Code Behind에서 한 번, XAML에서 한번. 사실, 내가 선언 한 경우 ** XAML에서만 ** 아무 것도 작동하지 않습니다. 이것은 XAML을 인식하지 못하기 때문에 내 VS 일 수 있습니다. 그래서 지금까지 색상 코딩을하지 않고 작업했습니다 ... 다시 설치할 시간입니다. – rTECH