當我們需要用到循環的列表內容,並且模板化程度高的時候,建議使用 ListBox 來做綁定。

XAML:
<Window.DataContext>
<local:VMTempTest/>
</Window.DataContext>
<StackPanel Margin="10,0,0,50" Orientation="Vertical" >
<TextBlock Text="ListBox 模板" FontWeight="Bold" Margin="0,5,0,5" ></TextBlock>
<DockPanel >
<StackPanel HorizontalAlignment="Left" DockPanel.Dock="Top" >
<ListBox x:Name="lb" ItemsSource="{Binding ListBoxData}" BorderThickness="0" >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Width="{Binding ActualWidth,RelativeSource={RelativeSource AncestorType={x:Type ListBox}}}"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Image Source="{Binding Img}" Width="96" Height="96"/>
<TextBlock HorizontalAlignment="Center" FontSize="16" Text="{Binding Info}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</StackPanel>
<StackPanel DockPanel.Dock="Bottom" DataContext="{Binding SelectedItem,ElementName=lb}" Margin="15 30 0 0" HorizontalAlignment="Left" Orientation="Vertical" >
<TextBlock Text="{Binding Info,StringFormat='選中:\{0\}'}" ></TextBlock>
</StackPanel>
</DockPanel>
</StackPanel>
ViewModel:
public class VMTempTest : ViewModelBase
{
public VMTempTest()
{
ListBoxData = new ObservableCollection<dynamic>(){
new { Img="/MyWpfApp;component/Images/1.jpg",Info="櫻桃" },
new { Img="/MyWpfApp;component/Images/2.jpg",Info="葡萄" },
new { Img="/MyWpfApp;component/Images/3.jpg",Info="蘋果" },
new { Img="/MyWpfApp;component/Images/4.jpg",Info="獼猴桃" },
new { Img="/MyWpfApp;component/Images/5.jpg",Info="檸檬" },
};
}
private IEnumerable listBoxData;
/// <summary>
/// LisBox數據模板
/// </summary>
public IEnumerable ListBoxData
{
get { return listBoxData; }
set { listBoxData = value; RaisePropertyChanged(() => ListBoxData); }
}
}
注意:要將放圖片的 Images 文件件包含到項目中來。Img="/MyWpfApp;component/Images/1.jpg" 這個初始化路徑也可以簡化成 Img="/Images/1.jpg"。
