Add a value converter to a binding using XAML

image_pdfimage_print


   
  


<StackPanel xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:WpfApplication1" Width="300" Height="300"
  Name="Page1">
  <StackPanel.Resources>
    <c:MyData x:Key="myDataSource"/>
    <c:MyConverter x:Key="MyConverterReference"/>
    <Style TargetType="TextBlock">
      <Setter Property="FontSize" Value="15"/>
      <Setter Property="Margin" Value="3"/>
    </Style>
  </StackPanel.Resources>
  
  <StackPanel.DataContext>
    <Binding Source="{StaticResource myDataSource}"/>
  </StackPanel.DataContext>

  <TextBlock Text="Unconverted data:"/>
  <TextBlock Text="{Binding Path=TheDate}"/>
  <TextBlock Text="Converted data:"/>
  <TextBlock Name="myconvertedtext" Foreground="{Binding Path=TheDate,Converter={StaticResource MyConverterReference}}">
    <TextBlock.Text>
      <Binding Path="TheDate" Converter="{StaticResource MyConverterReference}"/>
    </TextBlock.Text>
  </TextBlock>
</StackPanel>
//File:Window.xaml.cs
using System;
using System.Globalization;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Data;
using System.Windows.Media;


namespace WpfApplication1
{
  public class MyConverter : IValueConverter
  {
    public object Convert(object o, Type type,object parameter, CultureInfo culture){
        DateTime date = (DateTime)o;
        switch (type.Name)
        {
            case "String":
                return date.ToString("F", culture);
            case "Brush":
                return Brushes.Red;
            default:
                return o;
      }
    }
    public object ConvertBack(object o, Type type,object parameter, CultureInfo culture){
          return null;
    }
  }
  public class MyData: INotifyPropertyChanged{
    private DateTime thedate;
    public MyData(){
      thedate = DateTime.Now;
    }
    public DateTime TheDate
    {
      get{return thedate;}
      set{
        thedate = value;
        OnPropertyChanged("TheDate");
      }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged(String info)
    {
      if (PropertyChanged !=null)
      {
        PropertyChanged(this, new PropertyChangedEventArgs(info));
      }
    }
  }
}

   
    
     


Custom Dialog with data binding

image_pdfimage_print
   
  

<Window x:Class="CustomDialogSample.SettingsDialog"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="Settings"
  Height="200"
  Width="400"
  ResizeMode="CanResizeWithGrip"
  SizeToContent="WidthAndHeight"
  WindowStartupLocation="CenterOwner"
  FocusManager.FocusedElement="{Binding ElementName=myStringTextBox}"
  ShowInTaskbar="False">

  <StackPanel>
    <Label Target="{Binding ElementName=myStringTextBox}">Report _Folder</Label>
    <TextBox x:Name="myStringTextBox" Text="{Binding MyString}" />
    <Button x:Name="folderBrowseButton">...</Button>
    <Button HorizontalAlignment="Left" Name="reportColorButton">
       <StackPanel>
      <Rectangle Width="15" Height="15" SnapsToDevicePixels="True"
                   Fill="{StaticResource reportBrush}" />
        <AccessText Text="Report _Color..." Margin="10,0,0,0" />
      </StackPanel>
    </Button>
    <Button x:Name="okButton" IsDefault="True">OK</Button>
    <Button x:Name="cancelButton" IsCancel="True">Cancel</Button>
  </StackPanel>
</Window>
//File:Window.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.ComponentModel;


namespace CustomDialogSample {
    class DialogData : INotifyPropertyChanged {
      Color reportColor;
      public Color MyColor {
        get { return reportColor; }
        set { reportColor = value; Notify("MyColor"); }
      }

      string mystring;
      public string MyString {
        get { return mystring; }
        set { mystring = value; Notify("MyString"); }
      }

      public event PropertyChangedEventHandler PropertyChanged;
      void Notify(string prop) { if( PropertyChanged != null ) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); } }
    }
  public partial class SettingsDialog : System.Windows.Window {
    DialogData data = new DialogData();

    public Color MyColor {
      get { return data.MyColor; }
      set { data.MyColor = value; }
    }

    public string MyString {
      get { return data.MyString; }
      set { data.MyString = value; }
    }

    public SettingsDialog() {
      InitializeComponent();

      DataContext = data;

      reportColorButton.Click += reportColorButton_Click;
      folderBrowseButton.Click += folderBrowseButton_Click;
      okButton.Click += new RoutedEventHandler(okButton_Click);
    }

    void okButton_Click(object sender, RoutedEventArgs e) {
      DialogResult = true;
    }
    void reportColorButton_Click(object sender, RoutedEventArgs e) {
      System.Windows.Forms.ColorDialog dlg = new System.Windows.Forms.ColorDialog();
      Color color = MyColor;
      dlg.Color = System.Drawing.Color.FromArgb(color.A, color.R, color.G, color.B);

      if( dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK ) {
        MyColor = Color.FromArgb(dlg.Color.A, dlg.Color.R, dlg.Color.G, dlg.Color.B);
      }
    }

    void folderBrowseButton_Click(object sender, RoutedEventArgs e) {
      System.Windows.Forms.FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog();
      dlg.SelectedPath = MyString;
      if( dlg.ShowDialog() == System.Windows.Forms.DialogResult.OK ) {
        MyString = dlg.SelectedPath;
      }
    }

  }
}

   
    
     


One way and two way binding

image_pdfimage_print


   
  

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:src="clr-namespace:MyNameSpace.CustomElementBinding" 
        Title="Custom Element Binding Demo">
    <StackPanel>
    <ScrollBar Name="scroll"
               Orientation="Horizontal"
               Margin="24" 
               Maximum="100"
               LargeChange="10"
               SmallChange="1" 
               Value="{Binding ElementName=simple, Path=Number,Mode=TwoWay}" />
    <src:SimpleElement Number="{Binding ElementName=scroll,Path=Value,Mode=OneWay}"/>
    </StackPanel>
</Window>
//File:Window.xaml.cs
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Media;

namespace MyNameSpace.CustomElementBinding
{
    class SimpleElement : FrameworkElement
    {
        public static DependencyProperty NumberProperty;
        static SimpleElement()
        {
            NumberProperty = DependencyProperty.Register("Number", typeof(double),typeof(SimpleElement),
                    new FrameworkPropertyMetadata(0.0,FrameworkPropertyMetadataOptions.AffectsRender));
        }
        public double Number
        {
            set { SetValue(NumberProperty, value); }
            get { return (double)GetValue(NumberProperty); }
        }
        protected override Size MeasureOverride(Size sizeAvailable)
        {
            return new Size(200, 250);
        }
        protected override void OnRender(DrawingContext dc)    
        {
            dc.DrawText(new FormattedText(Number.ToString(), 
                        CultureInfo.CurrentCulture, FlowDirection.LeftToRight,
                        new Typeface("Times New Roman"), 12, 
                        SystemColors.WindowTextBrush),new Point(0, 0)); 
        }
    }
}

   
    
     


Object Binding

image_pdfimage_print


   
  

<Window x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="clr-namespace:WpfApplication1"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"
  Title="ListBinding" Height="325" Width="400">
  <Window.Resources>
    <ObjectDataProvider x:Key="Family" ObjectType="{x:Type local:RemoteEmployeesLoader}"
      IsAsynchronous="True" MethodName="LoadEmployees">
      <ObjectDataProvider.MethodParameters>
        <sys:String>http://host/d.dat</sys:String>
        <sys:String>http://host/d2.dat</sys:String>
      </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

    <local:AgeToForegroundConverter x:Key="ageConverter" />
    <DataTemplate DataType="{x:Type local:Employee}">
      <TextBlock>
        <TextBlock Text="{Binding Path=Name}" />
        (age: <TextBlock Text="{Binding Path=Age}" Foreground="{Binding Path=Age, Converter={StaticResource ageConverter}}" />)
      </TextBlock>
    </DataTemplate>
  </Window.Resources>
  <StackPanel DataContext="{StaticResource Family}">
    <ListBox ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True">
      <ListBox.GroupStyle>
        <x:Static Member="GroupStyle.Default" />
      </ListBox.GroupStyle>
    </ListBox>

    <TextBlock>Name:</TextBlock>
    <TextBox Text="{Binding Path=Name}" />
    <TextBlock>Age:</TextBlock>
    <TextBox Text="{Binding Path=Age}" Foreground="{Binding Path=Age, Converter={StaticResource ageConverter}}" />
      <Button Name="birthdayButton">Birthday</Button>
      <Button Name="backButton">&amp;lt;</Button>
      <Button Name="forwardButton">&amp;gt;</Button>
      <Button Name="addButton">Add</Button>
      <Button Name="sortButton">Sort</Button>
      <Button Name="filterButton">Filter</Button>
      <Button Name="groupButton">Group</Button>
  </StackPanel>
</Window>

//File:Window.xaml.cs

using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Collections.Generic;
using System.Diagnostics;
using System.ComponentModel; 
using System.Collections.ObjectModel;
using System.Collections;

namespace WpfApplication1 {
  public class Employee : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    protected void Notify(string propName) {
      if( this.PropertyChanged != null ) {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
      }
    }

    string name;
    public string Name {
      get { return this.name; }
      set {
        this.name = value;
        Notify("Name");
      }
    }

    int age;
    public int Age {
      get { return this.age; }
      set {
        this.age = value;
        Notify("Age");
      }
    }

    public Employee() { }
    public Employee(string name, int age) {
      this.name = name;
      this.age = age;
    }
  }

  public class Employees : ObservableCollection<Employee> { }

  public class RemoteEmployeesLoader {
    public Employees LoadEmployees(string url1, string url2) {
      Employees employees = new Employees();
      employees.Add(new Employee("A", 31));
      employees.Add(new Employee("B", 42));
      employees.Add(new Employee("C", 68));
      return employees;
    }
  }

  public partial class Window1 : Window {

    public Window1() {
      InitializeComponent();

      this.birthdayButton.Click += birthdayButton_Click;
      this.backButton.Click += backButton_Click;
      this.forwardButton.Click += forwardButton_Click;
      this.addButton.Click += addButton_Click;
      this.sortButton.Click += sortButton_Click;
      this.filterButton.Click += filterButton_Click;
      this.groupButton.Click += groupButton_Click;
    }

    ICollectionView GetFamilyView() {
      DataSourceProvider provider = (DataSourceProvider)this.FindResource("Family");
      Employees employees = (Employees)provider.Data;
      return CollectionViewSource.GetDefaultView(employees);
    }

    void birthdayButton_Click(object sender, RoutedEventArgs e) {
      ICollectionView view = GetFamilyView();
      Employee person = (Employee)view.CurrentItem;

      ++person.Age;
      Console.WriteLine(person.Name);
      Console.WriteLine(person.Age);
    }

    void backButton_Click(object sender, RoutedEventArgs e) {
      ICollectionView view = GetFamilyView();
      view.MoveCurrentToPrevious();
      if( view.IsCurrentBeforeFirst ) {
        view.MoveCurrentToFirst();
      }
    }

    void forwardButton_Click(object sender, RoutedEventArgs e) {
      ICollectionView view = GetFamilyView();
      view.MoveCurrentToNext();
      if( view.IsCurrentAfterLast ) {
        view.MoveCurrentToLast();
      }
    }

    void addButton_Click(object sender, RoutedEventArgs e) {
      DataSourceProvider provider = (DataSourceProvider)this.FindResource("Family");
      Employees employees = (Employees)provider.Data;
      employees.Add(new Employee("EE", 67));
    }

    class EmployeeSorter : IComparer {
      public int Compare(object x, object y) {
        Employee lhs = (Employee)x;
        Employee rhs = (Employee)y;

        int nameCompare = lhs.Name.CompareTo(rhs.Name);
        if( nameCompare != 0 )
          return nameCompare;
        return rhs.Age - lhs.Age;
      }
    }

    void sortButton_Click(object sender, RoutedEventArgs e) {
      ListCollectionView view = (ListCollectionView)GetFamilyView();
      if( view.CustomSort == null ) {
        view.CustomSort = new EmployeeSorter();
      }
      else {
        view.CustomSort = null;
      }
    }

    void filterButton_Click(object sender, RoutedEventArgs e) {
      ICollectionView view = GetFamilyView();
      if( view.Filter == null ) {
        view.Filter = delegate(object item) {
          return ((Employee)item).Age >= 25;
        };
      }
      else {
        view.Filter = null;
      }
    }

    void groupButton_Click(object sender, RoutedEventArgs e) {
      ICollectionView view = GetFamilyView();
      if( view.GroupDescriptions.Count == 0 ) {
        view.GroupDescriptions.Add(new PropertyGroupDescription("Age"));
      }
      else {
        view.GroupDescriptions.Clear();
      }
    }

  }

  public class AgeToForegroundConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
      Debug.Assert(targetType == typeof(Brush));

      int age = int.Parse(value.ToString());
      return (age > 25 ? Brushes.Red : Brushes.Black);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
      throw new NotImplementedException();
    }
  }

}

   
    
     


Without Binding

image_pdfimage_print


   
  
<Window
  x:Class="WpfApplication1.Window1"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  Title="WithoutBinding" Height="135" Width="200">
  <StackPanel>
    <TextBlock>Name:</TextBlock>
    <TextBox Name="nameTextBox"/>
    <TextBlock>Age:</TextBlock>
    <TextBox Name="ageTextBox"/>
    <Button Name="birthdayButton">Birthday</Button>
  </StackPanel>
</Window>
//File:Window.xaml.cs
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.ComponentModel;

namespace WpfApplication1{
  public class Employee : INotifyPropertyChanged {
    public event PropertyChangedEventHandler PropertyChanged;
    protected void Notify(string propName) {
      if( this.PropertyChanged != null ) {
        PropertyChanged(this, new PropertyChangedEventArgs(propName));
      }
    }

    string name;
    public string Name {
      get { return this.name; }
      set {
        this.name = value;
        Notify("Name");
      }
    }

    int age;
    public int Age {
      get { return this.age; }
      set {
        this.age = value;
        Notify("Age");
      }
    }

    public Employee() { }
    public Employee(string name, int age) {
      this.name = name;
      this.age = age;
    }
  }

  public partial class Window1 : Window {
    Employee emp = new Employee("Tom", 11);
    public Window1() {
      InitializeComponent();
      this.nameTextBox.Text = emp.Name;
      this.ageTextBox.Text = emp.Age.ToString();
      emp.PropertyChanged += emp_PropertyChanged;
      this.nameTextBox.TextChanged += nameTextBox_TextChanged;
      this.ageTextBox.TextChanged += ageTextBox_TextChanged;
      this.birthdayButton.Click += birthdayButton_Click;
    }

    void emp_PropertyChanged(object sender, PropertyChangedEventArgs e) {
      switch( e.PropertyName ) {
        case "Name":
        this.nameTextBox.Text = emp.Name;
        break;

        case "Age":
        this.ageTextBox.Text = emp.Age.ToString();
        break;
      }
    }

    void nameTextBox_TextChanged(object sender, TextChangedEventArgs e) {
      emp.Name = nameTextBox.Text;
    }

    void ageTextBox_TextChanged(object sender, TextChangedEventArgs e) {
      int age = 0;
      if( int.TryParse(ageTextBox.Text, out age) ) {
        emp.Age = age;
      }
    }

    void birthdayButton_Click(object sender, RoutedEventArgs e) {
      ++emp.Age;
      Console.WriteLine(emp.Name);
      Console.WriteLine(emp.Age);
    }
  }
}

   
    
     


Master Detail Binding

image_pdfimage_print


   
  

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MasterDetailBinding"
    xmlns:local="clr-namespace:WpfApplication1">
  <Window.Resources>
    <local:Companies x:Key="Companies">
      <local:Company CompanyName="Stooge">
        <local:Company.Members>
          <local:Team>
            <local:Employee Name="Larry" Age="21">
              <local:Employee.Skills>
                <local:Skills>
                  <local:Skill Description="A" />
                  <local:Skill Description="B" />
                  <local:Skill Description="C" />
                </local:Skills>
              </local:Employee.Skills>
            </local:Employee>
            <local:Employee Name="Moe" Age="22" >
              <local:Employee.Skills>
                <local:Skills>
                  <local:Skill Description="D" />
                  <local:Skill Description="E" />
                </local:Skills>
              </local:Employee.Skills>
            </local:Employee>
            <local:Employee Name="Curly" Age="23" >
              <local:Employee.Skills>
                <local:Skills>
                  <local:Skill Description="F" />
                  <local:Skill Description="G" />
                </local:Skills>
              </local:Employee.Skills>
            </local:Employee>
          </local:Team>
        </local:Company.Members>
      </local:Company>
      <local:Company CompanyName="Addams">
        <local:Company.Members>
          <local:Team>
            <local:Employee Name="Gomez" Age="135" >
              <local:Employee.Skills>
                <local:Skills>
                  <local:Skill Description="H" />
                  <local:Skill Description="Z" />
                  <local:Skill Description="Q" />
                </local:Skills>
              </local:Employee.Skills>
            </local:Employee>
            <local:Employee Name="Morticia" Age="121" >
              <local:Employee.Skills>
                <local:Skills>
                  <local:Skill Description="R" />
                  <local:Skill Description="P" />
                  <local:Skill Description="L" />
                </local:Skills>
              </local:Employee.Skills>
            </local:Employee>
            <local:Employee Name="Fester" Age="137" >
              <local:Employee.Skills>
                <local:Skills>
                  <local:Skill Description="R" />
                  <local:Skill Description="S" />
                  <local:Skill Description="U" />
                </local:Skills>
              </local:Employee.Skills>
            </local:Employee>
          </local:Team>
        </local:Company.Members>
      </local:Company>
    </local:Companies>
  </Window.Resources>
  <Grid DataContext="{StaticResource Companies}">
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition />
      <ColumnDefinition />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0">Companies:</TextBlock>
    <ListBox Grid.Row="1" Grid.Column="0" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Path=CompanyName}" />
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    <StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal">
      <TextBlock Text="{Binding Path=CompanyName}" />
      <TextBlock Text=" Company Members:" />
    </StackPanel>
    <ListBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding Path=Members}" IsSynchronizedWithCurrentItem="True">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock>
            <TextBlock Text="{Binding Path=Name}" />
            (age: <TextBlock Text="{Binding Path=Age}" />)
          </TextBlock>
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>
    <StackPanel Grid.Row="0" Grid.Column="2" Orientation="Horizontal">
      <TextBlock Text="{Binding Path=Members/Name}" />
      <TextBlock Text=" Skills:" />
    </StackPanel>
    <ListBox Grid.Row="1" Grid.Column="2" ItemsSource="{Binding Path=Members/Skills}" IsSynchronizedWithCurrentItem="True">
      <ListBox.ItemTemplate>
        <DataTemplate>
          <TextBlock Text="{Binding Path=Description}" />
        </DataTemplate>
      </ListBox.ItemTemplate>
    </ListBox>

  </Grid>
</Window>

//File:Window.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Collections.ObjectModel;


namespace WpfApplication1 {

  public class Skill {
    string description;
    public string Description {
      get { return description; }
      set { description = value; }
    }
  }

  public class Skills : ObservableCollection<Skill> { }

  public class Employee {
    string name;
    public string Name {
      get { return name; }
      set { name = value; }
    }

    int age;
    public int Age {
      get { return age; }
      set { age = value; }
    }

    Skills traits;
    public Skills Skills {
      get { return traits; }
      set { traits = value; }
    }
  }

  public class Team : ObservableCollection<Employee> { }

  public class Company {
    string familyName;
    public string CompanyName {
      get { return familyName; }
      set { familyName = value; }
    }

    Team members;
    public Team Members {
      get { return members; }
      set { members = value; }
    }
  }

  public class Companies : ObservableCollection<Company> { }

  public partial class Window1 : Window {
    public Window1() {
      InitializeComponent();
    }
  }
}

   
    
     


Data binding using collections composed of mixed types of data.

image_pdfimage_print


   
  

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:c="clr-namespace:WpfApplication1"
  x:Class="WpfApplication1.Window1"
  Title="CompositeCollections"
  SizeToContent="WidthAndHeight">
  <Window.Resources>
    <c:Employees x:Key="EmployeesData"/>

    <XmlDataProvider x:Key="NewStudentesData" XPath="NewStudentes/Student">
      <x:XData>
      <NewStudentes xmlns="">
        <Student Name="Jason" />
        <Student Name="Hercules" />
        <Student Name="Bellerophon" />
        <Student Name="Theseus" />
        <Student Name="Odysseus" />
        <Student Name="Perseus" />
      </NewStudentes>
      </x:XData>
    </XmlDataProvider>

    <DataTemplate DataType="{x:Type c:Employee}">
      <TextBlock Text="{Binding Path=Name}" Foreground="Gold"/>
    </DataTemplate>
    <DataTemplate DataType="Student">
      <TextBlock Text="{Binding XPath=@Name}" Foreground="Cyan"/>
    </DataTemplate>
  </Window.Resources>
  
  <StackPanel>
    <ListBox Name="myListBox" Height="300" Width="200">
      <ListBox.ItemsSource>
        <CompositeCollection>
          <CollectionContainer Collection="{Binding Source={StaticResource EmployeesData}}" />
          <CollectionContainer Collection="{Binding Source={StaticResource NewStudentesData}}" />
          <ListBoxItem Foreground="Red">Other Listbox Item 1</ListBoxItem>
        </CompositeCollection>
      </ListBox.ItemsSource>
    </ListBox>
  </StackPanel>
</Window>

//File:Window.xaml.cs

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Windows.Data;
using System.Collections.ObjectModel;

namespace WpfApplication1
{
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }
  }

  public class Employee
  {
        private string _name;

    public string Name
    {
            get
            {
                return _name;
            }
            set
            {
                _name = value;
            }
    }
        
        public Employee(string name)
        {
            Name = name;
        }
  }

  public class Employees : ObservableCollection<Employee>
  {
    public Employees()
    {
      Add(new Employee("A"));
      Add(new Employee("B"));
      Add(new Employee("C"));
    }
  }
}