Così come a volte WPF complica alcune cose che nei Windows Forms sono banali ci sono situazioni dove avviene il contrario.
Un esempio è il caso di una Listview come quella riportata qui sotto:

Lo Xaml necessario è il seguente:

   1:    <StackPanel Margin="8">    
   2:      <ListView Name="listView" ItemsSource="{Binding}">
   3:        <ListView.View>
   4:          <GridView>
   5:            <GridViewColumn Header="Name" DisplayMemberBinding="{Binding Name}" />
   6:            <GridViewColumn Header="Value" Width="140" x:Name="ValueColumn" >
   7:              <GridViewColumn.CellTemplate>
   8:                <DataTemplate>
   9:                  <ProgressBar Value="{Binding Value}" Minimum="0" Maximum="100" Width="{Binding ElementName=ValueColumn, Path=Width}" Height="10"  MinWidth="140"/>
  10:                </DataTemplate>
  11:              </GridViewColumn.CellTemplate>
  12:            </GridViewColumn>
  13:            <GridViewColumn Header="IsActive" >
  14:              <GridViewColumn.CellTemplate>
  15:                <DataTemplate>
  16:                  <CheckBox IsChecked="{Binding IsActive}"/>
  17:                </DataTemplate>
  18:              </GridViewColumn.CellTemplate>
  19:            </GridViewColumn>
  20:          </GridView>
  21:        </ListView.View>
  22:      </ListView>
  23:    </StackPanel>

e questo è il codice che associa i dati:.

   1:  public Window1 ()
   2:      {
   3:        InitializeComponent();
   4:        //Some data...
   5:        DataTable tbl = new DataTable("SomData");
   6:        tbl.Columns.Add("Name", typeof(string));
   7:        tbl.Columns.Add("Value", typeof(int));
   8:        tbl.Columns.Add("IsActive", typeof(bool));
   9:        tbl.Rows.Add("Mario Rossi", 40,false);
  10:        tbl.Rows.Add("Giulio Verdi", 70, true);
  11:        tbl.Rows.Add("Enrico Neri", 20, false);
  12:        this.DataContext = tbl;      
  13:      }