Text Data Binding

image_pdfimage_print


   
  
<Window x:Class="TextDataBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="TextDataBinding" Height="300" Width="300">
    <Grid>
      <TextBlock>
        Name:
        <TextBlock Text="{Binding FirstName}" />
        <TextBlock Text="{Binding LastName}" />
      </TextBlock>
    </Grid>
</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;


namespace TextDataBinding
{
    public partial class Window1 : System.Windows.Window
    {
        Person src = new Person();
        public Window1()
        {
            InitializeComponent();

            src.FirstName = "A";
            src.LastName = "B";

            this.DataContext = src;
        }

    }
    public class Person
    {
        private string firstNameValue;

        public string FirstName
        {
            get { return firstNameValue; }
            set { firstNameValue = value; }
        }

        private string lastNameValue;

        public string LastName
        {
            get { return lastNameValue; }
            set { lastNameValue = value; }
        }

    }
}

   
    
     


List 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"
  Title="List Binding" Height="135" Width="315">
  <Window.Resources>
    <local:People x:Key="Family">
      <local:Person Name="A" Age="11" />
      <local:Person Name="B" Age="27" />
      <local:Person Name="C" Age="38" />
    </local:People>
    <local:AgeToForegroundConverter x:Key="ageConverter" />
  </Window.Resources>
  <Grid DataContext="{StaticResource Family}">
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition Height="Auto" />
      <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.Row="0" Grid.Column="0" Margin="5" VerticalAlignment="Center">Name:</TextBlock>
    <TextBox Grid.Row="0" Grid.Column="1" Margin="5" Text="{Binding Path=Name}" />
    <TextBlock Grid.Row="1" Grid.Column="0" Margin="5" VerticalAlignment="Center">Age:</TextBlock>
    <TextBox Grid.Row="1" Grid.Column="1" Margin="5" Text="{Binding Path=Age}"
             Foreground="{Binding Path=Age, Converter={StaticResource ageConverter}}" />
    <StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal">
      <Button Name="birthdayButton" Width="75" Margin="5">Birthday</Button>
      <Button Name="backButton" Width="75" Margin="5">&amp;lt;</Button>
      <Button Name="forwardButton" Width="75" Margin="5">&amp;gt;</Button>
    </StackPanel>
  </Grid>
</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.ComponentModel;
using System.Collections.Generic;
using System.Diagnostics;

namespace WpfApplication1 {
  public class Person : 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 {
        if( this.name == value ) { return; }
        this.name = value;
        Notify("Name");
      }
    }

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

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

  class People : List<Person> { }
  public partial class Window1 : Window {
    public Window1() {
      InitializeComponent();
      this.birthdayButton.Click += birthdayButton_Click;
      this.backButton.Click += backButton_Click;
      this.forwardButton.Click += forwardButton_Click;
    }

    ICollectionView GetFamilyView() {
      People people = (People)this.FindResource("Family");
      return CollectionViewSource.GetDefaultView(people);
    }

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

      ++person.Age;
      System.Console.WriteLine(person.Name);
      System.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();
      }
    }

  }

  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();
    }
  }

}

   
    
     


Async 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="BindingWithFallback" Height="300" Width="300">
    <StackPanel>
      <TextBox Text="{Binding Path=MyProperty, Mode=OneWay, FallbackValue=(waiting), IsAsync=True}" IsReadOnly="True" />
    </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;


namespace WpfApplication1{

  class MyClass {
    public string MyProperty { get { System.Threading.Thread.Sleep(2000); return "BBB"; } }
  }

  public partial class Window1 : System.Windows.Window {

    public Window1() {
      InitializeComponent();
      DataContext = new MyClass();
    }

  }
}

   
    
     


Null property 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="BindingWithFallback" Height="300" Width="300">
    <StackPanel>
      <TextBox Text="{Binding Path=NullProperty.FastProperty, Mode=OneWay, FallbackValue=(null)}" IsReadOnly="True" />
    </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;


namespace WpfApplication1{

  class MyClass {
    public MyClass NullProperty { get { return null; } }
  }

  public partial class Window1 : System.Windows.Window {

    public Window1() {
      InitializeComponent();
      DataContext = new MyClass();
    }

  }
}

   
    
     


Binding Property with Exception

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="BindingWithFallback" Height="300" Width="300">
    <StackPanel>
      <TextBox Text="{Binding Path=ExceptionProperty, Mode=OneWay, FallbackValue=(oops)}" IsReadOnly="True" />
    </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;


namespace WpfApplication1{

  class MyClass {
    public string ExceptionProperty { get { throw new Exception("Oops!"); } }
  }

  public partial class Window1 : System.Windows.Window {

    public Window1() {
      InitializeComponent();
      DataContext = new MyClass();
    }

  }
}

   
    
     


Hierarchical Binding for three level nested objects

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="HierarchicalBinding" xmlns:local="clr-namespace:WpfApplication1">
  <Window.Resources>
    <local:Companies x:Key="Companies">
      <local:Company CompanyName="CompanyA">
        <local:Company.Members>
          <local:People>
            <local:Employee Name="EmployeeA" Age="21">
              <local:Employee.Comments>
                <local:Comments>
                  <local:Comment Description="Comment1" />
                  <local:Comment Description="Comment2" />
                  <local:Comment Description="Comment3" />
                </local:Comments>
              </local:Employee.Comments>
            </local:Employee>
            <local:Employee Name="Moe" Age="22" >
              <local:Employee.Comments>
                <local:Comments>
                  <local:Comment Description="Nice" />
                  <local:Comment Description="Comment3" />
                </local:Comments>
              </local:Employee.Comments>
            </local:Employee>
            <local:Employee Name="Curly" Age="23" >
              <local:Employee.Comments>
                <local:Comments>
                  <local:Comment Description="Comment6" />
                  <local:Comment Description="Comment3" />
                </local:Comments>
              </local:Employee.Comments>
            </local:Employee>
          </local:People>
        </local:Company.Members>
      </local:Company>
      <local:Company CompanyName="CompanyB">
        <local:Company.Members>
          <local:People>
            <local:Employee Name="EmployeeB" Age="135" >
              <local:Employee.Comments>
                <local:Comments>
                  <local:Comment Description="Comment8" />
                  <local:Comment Description="Comment7" />
                  <local:Comment Description="Comment5" />
                </local:Comments>
              </local:Employee.Comments>
            </local:Employee>
            <local:Employee Name="EmployeeC" Age="121" >
              <local:Employee.Comments>
                <local:Comments>
                  <local:Comment Description="Comment8" />
                  <local:Comment Description="Pale" />
                  <local:Comment Description="Comment4" />
                </local:Comments>
              </local:Employee.Comments>
            </local:Employee>
            <local:Employee Name="EmployeeD" Age="137" >
              <local:Employee.Comments>
                <local:Comments>
                  <local:Comment Description="Comment8" />
                  <local:Comment Description="Comment6" />
                  <local:Comment Description="Comment3" />
                </local:Comments>
              </local:Employee.Comments>
            </local:Employee>
          </local:People>
        </local:Company.Members>
      </local:Company>
    </local:Companies>

    <HierarchicalDataTemplate DataType="{x:Type local:Company}"
      ItemsSource="{Binding Path=Members}">
      <TextBlock Text="{Binding Path=CompanyName}" />
    </HierarchicalDataTemplate>

    <HierarchicalDataTemplate DataType="{x:Type local:Employee}"
      ItemsSource="{Binding Path=Comments}">
      <TextBlock>
        <TextBlock Text="{Binding Path=Name}" />
        (age: <TextBlock Text="{Binding Path=Age}" />)
      </TextBlock>
    </HierarchicalDataTemplate>

    <DataTemplate DataType="{x:Type local:Comment}">
      <TextBlock Text="{Binding Path=Description}" />
    </DataTemplate>

  </Window.Resources>

  <TreeView DataContext="{StaticResource Companies}">
    <TreeViewItem ItemsSource="{Binding}" Header="Companies" />
  </TreeView>
</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 Comment {
    string description;
    public string Description {
      get { return description; }
      set { description = value; }
    }
  }

  public class Comments : ObservableCollection<Comment> { }

  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; }
    }

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

  public class People : ObservableCollection<Employee> { }

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

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

  public class Companies : ObservableCollection<Company> { }

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

   
    
     


BindingOperations.GetBindingExpression

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" 
  Title="ManualUpdateTarget" Height="135" Width="200">
  <Window.Resources>
    <local:Person x:Key="Tom" Name="Tom" Age="11" />
  </Window.Resources>
  <StackPanel DataContext="{StaticResource Tom}">
    <TextBlock Margin="5" VerticalAlignment="Center">Name:</TextBlock>
    <TextBox Margin="5" Name="nameTextBox" Text="{Binding Path=Name}" />
    <TextBlock Margin="5" VerticalAlignment="Center">Age:</TextBlock>
    <TextBox Margin="5" Name="ageTextBox" Text="{Binding Path=Age}" />
    <Button Margin="5" Width="75" 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 Person {
    string name;
    public string Name {
      get { return this.name; }
      set {
        if( this.name == value ) { return; }
        this.name = value;
      }
    }

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

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

  public partial class Window1 : System.Windows.Window {
    public Window1() {
      InitializeComponent();
      this.birthdayButton.Click += birthdayButton_Click;
    }

    void birthdayButton_Click(object sender, RoutedEventArgs e) {
      Person person = (Person)this.FindResource("Tom");
      person.Age = person.Age+1;
      BindingOperations.GetBindingExpression(ageTextBox, TextBox.TextProperty).UpdateTarget();

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