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

}