【发布时间】:2014-02-05 16:27:31
【问题描述】:
我的 WPF 应用程序有一个包含多个项目的列表框。在每个项目上,我们都有一个图像和一个文本框。
请参阅下面的 XAML:
<ListBox x:Name="lstMagic" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="10,200,10,0" Width="Auto" Height="558" Background="{x:Null}" BorderBrush="Transparent">
<ListBoxItem>
<StackPanel Orientation="Horizontal">
<Image Source="images/plates/pig.jpg" Margin="0,0,5,0" Width="72"/>
<TextBox IsReadOnly="True" Background="{x:Null}" Foreground="White" Width="912">Some Magic is going to happen</TextBox>
</StackPanel>
</ListBoxItem>
所以列表按预期从猪开始。在猪面前,他成功加载了 pig.jpg。
在那个表单部分旁边,我有一个按钮。我可以在那个按钮上做一些魔术来添加一个新的 listBoxItem。
private void btnDoMagic(object sender, RoutedEventArgs e)
{
ListBoxItem newMagic = new ListBoxItem();
Image imageCurrent = new Image();
imageCurrent.Source = new BitmapImage(new Uri("images/plates/someOtherImage.jpg", UriKind.RelativeOrAbsolute));
newMagic.Content = imageCurrent;
lstCardapio.Items.Add(newMagic);
}
}
此功能有效,并将图像成功添加到列表中!但我有一些问题: 我怎样才能像我的第一个 XAML 一样制作?一个图像和一个文本框?如何在我的按钮事件中添加这些?
我需要这样做,因为我们将从数据库中获取这些项目,因此我们必须动态加载这些项目。
【问题讨论】:
-
不要在 WPF 的过程代码中创建或操作 UI 元素。这就是 XAML 的用途。使用
ObservableCollection<T>创建一个适当的 ViewModel 并将ListBox.ItemsSource绑定到该集合。然后使用ListBox.ItemTemplate属性定义每个项目的 UI 外观。 -
因为 WPF 不打算以这种方式使用。你最终会得到很多不需要的、难以维护的代码。创建一个合适的 ViewModel,你所有的问题都会神奇地消失。