私は次のコードを持っていますが、基本的に私が理解できないのは、グリッド全体を複製し、それらの空のコピーを並べて作成する方法です....明確に理解するために、これは病院のアプリケーションと関係がありますグリッドは妊娠に関連しているため、「ADD CHILD」ボタンを実行時にまったく新しいグリッドを作成する必要があります。
3 に答える
「複製」したいオブジェクトを に配置し、DataTemplate
からこのテンプレートを参照ItemsControl
する必要があります。次に、別のグリッドが必要な場合は、アイテム コントロールに別のアイテムを追加します (または、コントロールがバインドされているリストに追加することをお勧めします) ItemsControl
。新しいグリッドを作成し、それを新しいオブジェクトにバインドします。
例として、私のブログのこの投稿を見てください。
このアプリケーションの例を次に示します (関連する部分のみを残し、テストを行っていないため、タイプミスがある可能性があります)。
<Window ... >
<Window.Resources>
<DataTemplate x:Key="ChildTemplate">
<Grid>
...
<TextBlock Text="Delivery Date:" Grid.Column="0" Grid.Row="0"/>
<TextBox Text="{Binding DeliveryDate}" Grid.Column="1" Grid.Row="0"/>
<TextBlock Text="Delivery Time:" Grid.Column="0" Grid.Row="1"/>
<TextBox Text="{Binding DeliveryTime}" Grid.Column="1" Grid.Row="1"/>
...
</Grid>
</DataTemplate>
</Window.Resources>
...
<Button Content="AddChild" Click="AddChildClick"/>
...
<ScrollViewer>
<ItemsControl ItemsSource="{Binding AllChildren}" ItemsTemplate="{StaticResource ChildTemplate}">
<ItemsControl.PanelTemplate>
<ItemsPanelTemplate><StackPanel Orientation="Horizontal"/></ItemPanelTemplate>
<ItemsControl.PanelTemplate>
</ScrollViewer>
...
</Window>
そしてcsで:
- すべてのフォーム データを含むオブジェクトを Window の として設定します
DataContext
。このクラスを と呼びますPostDelveryData
。 - 繰り返しデータを使用して別のクラスを作成します。私はそれを呼びます
ChildDeliveryData
。 ObservableCollection<ChildDeliveryData>
に呼び出されるタイプのプロパティを追加しAllChildren
ますPostDeliveryData
。それが重要でObservableCollection
あり、他のタイプのコレクションではありません。さて、魔法のために:
private void AddChildClick(object sender, RoutedEvetnArgs e) { ((PostDeliveryData)DataContext).AllChildren.Add(new ChildDeliveryData()); }
リストに新しい項目を追加すると、データ テンプレート全体の別のコピーが追加されます。
ここで正しいアプローチを使用しているかどうかはわかりません。Child プロパティを使用して「ChildGridControl」を作成し、Child プロパティにデータバインディングを処理させることで、この問題に取り組みます。GUI に新しい子を追加するには、ChildGridControl の新しいインスタンスを作成する必要があります。
私が正しく理解している場合は、Grid と後続のコントロールを内部にラップする UserControl を作成する必要があります。そして、その UI をレプリケートしたい場所ならどこでも、このユーザー コントロールを使用します。