Вы должны использовать ItemsControl
всякий раз, когда хотите отобразить динамическую коллекцию элементов.
Замените StackPanel
в разметке XAML на ItemsControl
:
<ItemsControl ItemsSource="{Binding Cards}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:LoggerRepresentation />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Привязка непосредственно к свойствам источника соответствующего объекта Card
в UserControl
(и замена элементов Label
на TextBlocks
):
<TextBlock Text="{Binding Path=Id}" />
<TextBlock Text="{Binding Path=Value} />
Создайте класс модели представления, который предоставляет доступ к коллекции Card
объектов через открытое свойство и перенесите логику вашего приложения на это:
public class ViewModel
{
public ObservableCollection<Card> Cards { get; } = new ObservableCollection<Card>();
//...
private void OnDataReceived(List<Reading> readings)
{
foreach (Reading r in readings)
{
Cards.Add(new Card
{
Id = r.Id,
Value = r.Value
});
}
}
}
Установите DataContext
вида, где ItemsControl
определен для экземпляра класса модели вида:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new ViewModel();
}
}
Этот шаблон проектирования известен как Model-View-ViewModel (MVVM), и это рекомендуемый шаблон, который следует использовать при разработке приложений на основе XAML. Вы найдете намного больше, чтобы прочитать и узнать об этом, если ваш Google.