2017-02-07 42 views
0

私のWPFアプリケーションでは、実行時にユーザーによって生成されたいくつかのアイテムが必要です。これらは異なるクラスからのものなので、オリジナルのアイデアはObservable Collectionsにそれらを追加し、それらをItemsSourceや異なるItemsControlとして使用することでした。しかし、WPFは私にエラーを与えます。System.InvalidOperationException:ItemsSourceを使用する前にItemsコレクションが空である必要があります。私はWPFのエキスパートではありませんが、THIS SOの質問への答えは、私は1 ItemsControlしか持てないことを示しているようです。WPF:異なるItemsSourcesを持つ複数のItemsControlを持つことはできますか?

THIS私はCompositeCollectionクラスを使うべきでしょうが、引用した質問とは違って、全く異なるタスクのためにObservable Collectionsがいくつかあります。ここで

は、2つのコレクションを持つ私のXAML.CSの関連する部分である:カスタムインタフェースタイプの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要素を使用すればよいですか?参照と簡単な説明のいくつかの単語は十分以上です、私は自分自身を残りのGoogleをすることができます、私はちょうど実際に何を探すかわからない。

+0

私が間違っていることの1つは、XAMLで 'ItemsSource'をバインドする必要がなく、コンストラクタにも設定することです。メンバプロパティ( 'ProcessElements'と' PathElements')だけを設定すれば十分です。それが例外を引き起こしている可能性があります。そうでない場合は、どの行が例外をスローしますか? – Andy

+0

これは問題の原因ではありませんでしたが、コードビハインドでItemsSource _only_を設定しているようです。これを指摘してくれてありがとう! – rTECH

答えて

1

あなたのDataTemplateをする「PathControl」のItemTemplateにプロパティを設定する必要があります。

<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>要素を省略した場合、あなたはItemsControlItemsコレクションにDataTemplateを追加しているとのことができます。 ItemsSourceプロパティも設定します。

これを実行しようとすると、表示されるエラーメッセージでSystem.InvalidOperationException例外がスローされます。

複数のItemsControlが同じソースコレクションにバインドすることは、まったく問題ありません。

0

ItemsSourceを2回設定しているようです。 XAMLで1回、コードの後ろに1回。 Itemsソースを設定し、observableコレクションを初期化するだけのコードを削除します。 XAMLはコレクションへのバインドを処理する必要があります。

+0

さて、コードビハインドで2度、これを2回定義します。PathControl.ItemsSource = PathElements = new ObservableCollection (); XAMLで一度: しかし、面白いことに、最初のObservableコレクションをエラーなしで**同じ**方法で使用していたということです。コードビハインドで1回、次にXAMLで1回です。実際、もし私がそれらを宣言すれば、XAMLの**だけが動作します。これはXAMLを認識しないので、私のVSである可能性が高いので、これまでの色分けで作業しました...再インストールする時間。 – rTECH

関連する問題