### 先去 CODE 下面是 view model ```c# // 定義一個 private log message 的 ovservable collection (如果用普通 list 的話, wpf 會唔識 reactive update 個 UI) private ObservableCollection<LogMessage> _logMessages = new ObservableCollection<LogMessage>(); // 再定義一個 public 的 Log messages 用來呼叫 OnPropertyChanged() 通知 wpf update 返個 UI public ObservableCollection<LogMessage> LogMessages { get => _logMessages; set { if (_logMessages != value) { _logMessages = value; OnPropertyChanged(); } } } ``` 下面是 xaml ```xaml <ListView ItemsSource="{Binding Path=LogMessages}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Grid.Row="1" Grid.Column="0"> <ListView.ItemContainerStyle> <Style TargetType="ListViewItem"> <Setter Property="Focusable" Value="False" /> <Setter Property="IsHitTestVisible" Value="False" /> </Style> </ListView.ItemContainerStyle> <ListView.ItemTemplate> <DataTemplate> <Grid Margin="0,0,0,10"> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> <RowDefinition Height="auto" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <TextBlock Text="{Binding Path=Title}" Foreground="{Binding Path=Color}" FontWeight="Bold" TextWrapping="Wrap" FontSize="14" Grid.Row="0" Grid.Column="0" /> <TextBlock Text="{Binding Path=Message}" Foreground="{Binding Path=Color}" TextWrapping="Wrap" Grid.Row="1" Grid.Column="0" /> <TextBlock Text="{Binding Path=LogAt}" Foreground="#999999" TextWrapping="Wrap" Margin="0,5,0,0" Grid.Row="2" Grid.Column="0" /> </Grid> </DataTemplate> </ListView.ItemTemplate> </ListView> ``` 這樣就可以輕鬆畫出 listview 