2016-07-26 4 views
0

編集:
答え:はい、あります。 Combobox_SelectionChangedが発砲されるたびに、別のイベントハンドラが追加されたというエラーが見つかりました。そのため、コレクションはうまく見えましたが、Items_CollectionChangedは複数回起動されました。これが修正されると、すべて正常に機能しました。
終了編集。Grid.Children.Clear()は実際にすべてのコントロールを削除しますか?

私はコンボボックスとグリッドのあるページを持っています。コンボボックスの選択が変更されると、グリッドが動的に塗りつぶされます。私は今、奇妙なことを観察している。コンボボックスで2回目の値を選択すると、グリッド内の子アイテムが2回表示されます。私は基になるコレクションをチェックしました。これは上手く見えます(アイテムごとに1つのレコードのみ)。 Grid.Children.Clear()コマンドの後にcombobox_SelectionChangedメソッドから飛び出すと、画面が正常に表示されます(空の場合)。

私の推測では、Grid.Children.Clear()はビジュアルツリーからコントロールを削除するだけですが、実際のコントロールはまだぶら下がっています。何か案は?

private void combobox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    grItems.Children.Clear(); 
    grItemsColumnDefinitions.Clear(); 
    grItemsColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(200) }); 
} 

    private void Items_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e) 
    { 

     if (e.Action == NotifyCollectionChangedAction.Add) 
     { 
      grItems.Children.Add(new ChildItemControl(e.NewItems[0])); 
     } 

    } 

編集: enter image description here

+0

は興味があるだけ、あなたが使用することはできません理由がありますこれを手動でグリッドに追加するのではなく、バインドしますか? – Charleh

+0

私はxamlスキルが欠けている理由の1つですが、もう1つは、構造自体が表示される方法と同様に複雑であるということです。そこにいくつかの垂直と水平のレイヤーが追加されました(日、バイヤー、部門、aso)ので、コントロールがコードビハインドで追加されている場合は、扱いが簡単でした。 –

+0

データの「構造」がデータ結合には複雑すぎるとは思わないでください。データが複雑になればなるほど、バインディングテンプレートよりもバックエンドロジックのミスを犯すことになりますので、データバインディングに依存する必要があります。 SOのドキュメンテーションセクションのMVVMサンプルを見てください:http://stackoverflow.com/documentation/wpf/2134/simple-mvvm-example#t=201607261427091123224 –

答えて

1

は、私はあなたがWPFのためのデータバインディングに建てられた使用を示唆している(例 - - うまくいけば理解できる架空の)全体のものはこのように見えることになっています。

<DataGrid x:Name="grItems" ItemsSource="{Binding comboboxItems}" /> 

その後、あなたは自動的にあまりにも更新しますcomboboxItemsグリッドを更新:あなたはこのようなものを使用することができます!
ここ は、DataGridコントロールでデータバインディングの素晴らしい記事です:一般的にはデータバインディングの詳細については http://www.wpftutorial.net/DataGrid.html

、ここで良い記事です:https://msdn.microsoft.com/en-us/library/aa480224.aspx

関連する問題