### 先去 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
