WPFAQS – “ObjectDataProvider” and its usage in WPF/XAML

WPFAQS – is a series on WPF frequently asked questions (FAQS). Today we will talk about “ObjectDataProvider” and how does it can be used as a binding source for different controls.

WPFAQS(004) – How do we use “ObjectDataProvider “ as a binding data source? Give examples
Prerequisite/s – WPF-Style and Templates.

“ObjectDataProvider” Class resides in the “System.Windows.Data” namespace and derived from “DataSourceProvider”, provides a wrapper around objects and provides an elegant way to create those objects and use as a binding data source in XAML. It provides the following properties for you to execute a query on your object and bind to the results. The most important thing that I liked about it for using it asynchronously by setting “IsAsynchronous” property to specify the object creation in a worker thread or in the active context. Also you can use “ConstructorParameters” property enabling to pass parameters if some objects creation requires them. Another important property is the “ MethodName” property to call a method of an object, and if the method requires parameters to be passed, use “MethodParameters” property. Here is the class diagram for it.

ClassDiagrams3

Show time! Lets consider the following “BrushesHelper” static class and we’ll bind the “GetBrushNames” method using “ObjectDataProvider” in the XAML a little later, here it goes:

   1:  namespace Shams.Wpf.LegoDraw.Utils
   2:  {
   3:      public sealed class BrushesHelper
   4:      {
   5:          /// <summary>
   6:          /// GetBrushNames returns brushes names of type IEnumerable[string], 
   7:          /// that can further be used in foreach iteration. 
   8:          /// </summary>
   9:          public static IEnumerable<string> GetBrushNames()
  10:          {
  11:              // we are interested only in public and static members thats why BindingFlags.Public | BindingFlags.Static
  12:              foreach (PropertyInfo propertyInfo in 
  13:                  typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static))
  14:              {
  15:                  yield return propertyInfo.Name;
  16:              }
  17:          }
  18:      }
  19:  }

Also consider this Enum, we’ll also bind it using “ObjectDataProvider” in the XAML.

   1:  namespace Shams.Wpf.LegoDraw.Model
   2:  {
   3:      public enum GridTypes
   4:      {
   5:          Grid_8x8 = 8,
   6:          Grid_16x16 = 16,
   7:          Grid_24x24 = 24,
   8:          Grid_32x32 = 32,
   9:          Grid_36x36 = 36,
  10:          Grid_48x48 = 48,
  11:          Grid_64x64 = 64
  12:      }
  13:  }

Here is the XAML, showing the bindings of the above types, “BrushesHelper”  & “GridTypes”

   1:  <Window x:Class="Shams.Wpf.LegoDraw.LegoDrawWin"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:      xmlns:sys="clr-namespace:System;assembly=mscorlib"        
   5:      xmlns:local="clr-namespace:Shams.Wpf.LegoDraw.Controls"
   6:      xmlns:model="clr-namespace:Shams.Wpf.LegoDraw.Model"
   7:      xmlns:utils="clr-namespace:Shams.Wpf.LegoDraw.Utils"
   8:      Title="WPF | LegoDraw | by shams@geekscafe.NET" 
   9:      Width="447" Height="206" WindowStartupLocation="CenterScreen"
  10:      >
  11:   
  12:      <Window.Resources>
  13:          <ObjectDataProvider x:Key="brushes" 
  14:                              ObjectType="{x:Type utils:BrushesHelper}"  
  15:                              MethodName="GetBrushNames"/>
  16:          
  17:          <ObjectDataProvider x:Key="gridTypes" 
  18:                              MethodName="GetValues" 
  19:                              ObjectType="{x:Type sys:Enum}">
  20:              <ObjectDataProvider.MethodParameters>
  21:                  <x:Type TypeName="model:GridTypes" />
  22:              </ObjectDataProvider.MethodParameters>
  23:          </ObjectDataProvider>
  24:      </Window.Resources>
  25:   
  26:      <Grid x:Name="LayoutRoot">
  27:          <Grid.RowDefinitions>
  28:              <RowDefinition Height="22"/>
  29:              <RowDefinition Height="2"/>
  30:              <RowDefinition Height="22"/>
  31:              <RowDefinition Height="*"/>
  32:          </Grid.RowDefinitions>
  33:          <StackPanel Grid.Row="2" Orientation="Horizontal" Background="Silver">
  34:              <TextBlock Margin="5,0,5,0" VerticalAlignment="Center">Grid</TextBlock>
  35:              <ComboBox x:Name="ComboBoxGrid" Width="65"
  36:                ItemsSource="{Binding Source={StaticResource gridTypes}}" 
  37:                SelectedValue="{Binding Source={StaticResource gridTypes}, Path=[1]}" 
  38:                FontSize="11" 
  39:               >
  40:                  <ComboBox.ItemTemplate>
  41:                      <DataTemplate>
  42:                          <TextBlock Text="{Binding}" x:Name="PART_Text" />
  43:                          <DataTemplate.Triggers>
  44:                              <DataTrigger Binding="{Binding}" Value="Grid_8x8">
  45:                                  <Setter TargetName="PART_Text" 
  46:                                          Property="Text" Value="8 x 8" />
  47:                              </DataTrigger>
  48:                              <DataTrigger Binding="{Binding}" Value="Grid_16x16">
  49:                                  <Setter TargetName="PART_Text" 
  50:                                          Property="Text" Value="16 x 16" />
  51:                                  <Setter TargetName="PART_Text" 
  52:                                          Property="FontWeight" Value="Bold" />
  53:                              </DataTrigger>
  54:                              <DataTrigger Binding="{Binding}" Value="Grid_24x24">
  55:                                  <Setter TargetName="PART_Text" 
  56:                                          Property="Text" Value="24 x 24" />
  57:                              </DataTrigger>
  58:                              <DataTrigger Binding="{Binding}" Value="Grid_32x32">
  59:                                  <Setter TargetName="PART_Text" 
  60:                                          Property="Text" Value="32 x 32" />
  61:                              </DataTrigger>
  62:                              <DataTrigger Binding="{Binding}" Value="Grid_36x36">
  63:                                  <Setter TargetName="PART_Text" 
  64:                                          Property="Text" Value="36 x 36" />
  65:                              </DataTrigger>
  66:                              <DataTrigger Binding="{Binding}" Value="Grid_48x48">
  67:                                  <Setter TargetName="PART_Text" 
  68:                                          Property="Text" Value="48 x 48" />
  69:                              </DataTrigger>                            
  70:                              <DataTrigger Binding="{Binding}" Value="Grid_64x64">
  71:                                  <Setter TargetName="PART_Text" 
  72:                                          Property="Text" Value="64 x 64" />
  73:                              </DataTrigger>
  74:                          </DataTemplate.Triggers>
  75:                      </DataTemplate>
  76:                  </ComboBox.ItemTemplate>
  77:              </ComboBox>
  78:              <TextBlock Margin="5,0,5,0" VerticalAlignment="Center">Background</TextBlock>
  79:              <ComboBox x:Name="ComboBoxBackground" 
  80:                        ItemsSource="{Binding Source={StaticResource brushes}}" 
  81:                        Width="150" 
  82:                        SelectedValue="Transparent" 
  83:                        FontSize="11" 
  84:                        >
  85:                  <ComboBox.ItemTemplate>
  86:                      <DataTemplate>
  87:                          <StackPanel Margin="1" Orientation="Horizontal" >
  88:                              <Rectangle x:Name="PART_Rect" Fill="{Binding}" 
  89:                                         Height="11" Width="11" Margin="1"/>
  90:                              <TextBlock x:Name="PART_Text" Text="{Binding}" 
  91:                                         Margin="3 0 0 0" />
  92:                          </StackPanel>
  93:                      </DataTemplate>
  94:                  </ComboBox.ItemTemplate>
  95:              </ComboBox>
  96:              <TextBlock Margin="5,0,5,0" VerticalAlignment="Center">Delete mode</TextBlock>
  97:              <CheckBox x:Name="DeleteCheckBox" VerticalAlignment="Center"></CheckBox>
  98:   
  99:          </StackPanel>
 100:          <Grid Grid.Row="3" x:Name="MainGrid"  Background="Gray">
 101:              <ScrollViewer Margin="0.5">
 102:                  <Viewbox x:Name="chartViewBox" Stretch="UniformToFill">
 103:                      <!--<local:LegoDrawBoard x:Name="MainBoard" Width="500" Height="500" Margin="1"/>-->
 104:                  </Viewbox>
 105:              </ScrollViewer>
 106:          </Grid>
 107:      </Grid>
 108:  </Window>

Lines 13-23 creates the “ObjectDataProviders” using Enum “GridTypes” and “GetBrushNames” method of the type “BrushesHelper”. And they are set as binding data sources for the comboboxes in Lines 35 and 79 respectively. Here is the output for it.

MainWindow2

That's all for now on “ObjectDataProvider” and look forward to your feed-back. enjoy :)

If you enjoyed reading this blog, leave your valuable feedback and consider subscribing to the RSS feed. You can also subscribe to it by email. Also, you can follow me on Twitter. Thank you!

Comments (2) -

Esperanza
12/8/2017 10:57:42 PM #

Maravilhoso   post! Esse conteúdo  com certeza me ajudou.  ParabŽns e continue  colocando   posts  t‹o  incr’veis como esse.

2OO9.   Dimensões, vol.  Art.   11ª ed. Editora Impetus.

plan cultive Mot fleche
12/11/2017 5:38:02 AM #

Een vibrator is nou niet het eerste waar je aan denkt als we het over hulpmiddelen hebben voor anale seks.

Milagros
12/13/2017 7:25:37 AM #

I am curious to find out what blog system you have been utilizing? I'm experiencing some small security problems with my latest site and I'd like to find something more safe. Do you have any solutions?  Feel free to surf to my blog post ::  Milagros - xareltolegalline.bitbucket.org/.../...S-66043.html

Andra
12/14/2017 9:54:26 AM #

cliente poderá solicitar free pass unicamente uma vez.

service de femme de ménage
12/14/2017 7:01:41 PM #

service de femme de ménage Franchise de Nettoyage Résidentiel et Commercial, service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d'entretien ménager montréal Nous aidons les personnes désireuses d’être propriétaires d’entreprises prospères à devenir des professionnels du nettoyage commercial et de la maintenance. En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une aide apportée par un modèle d’affaires éprouvé vous assurant de travailler avec un leader du domaine disposant de l’expérience et la stabilité. Vous disiez augmentez vos revenus afin d'améliorer votre quotidien ? Faites Appel a G.E.M Ménage! service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d'entretien ménager montréal, service de femme de ménage ,entretien ménager commercial,entretien ménager commercial, ménage résidentiel, service d'entretien ménager montréal Franchises de Nettoyage Résidentiel et Commercial disponible Partout A Montréal ,Rive Nord et Rive Sud.  G.E.M Ménage s’adapte.  Choisissez le jour à votre convenance.  Le choix le plus populaire est une fois par semaine. Toutefois, vous êtes libre de déterminer votre fréquence moindre, toutes les deux semaines, une fois par mois…. G.E.M MÉNAGE s’adapte à votre besoin et à votre budget.  Nous individualisons le service de nettoyage. Notre expérience nous a enseigné que chaque immeuble ou maison est unique, comme les gens qui y vivent.  Le prix pour nettoyer un immeuble ou une maison est basée sur plusieurs facteurs.  La taille du lieu et la fréquence de nettoyage sont pris en compte. Cependant, nous intégrons également dans notre analyse, les surfaces à nettoyer et à désinfecter, la présence ou non d’animaux de compagnie, l’encombrement du lieu.  Pour vous proposer un devis qui conviendra à votre budget, G.E.M MÉNAGE vous rencontre chez vous afin de prendre connaissance du  lieu et mieux comprendre vos besoins et exigences de nettoyage.Si beaucoup pensent que le nettoyage de bureaux se résume à passer l’aspirateur, nettoyer les vitrines et vider les poubelles, En faisant appel à une entreprise telle que G.E.M Québec, vous avez la garantie d’un nettoyage régulier et de qualité professionnelle.  Les prestations sont effectuées par des agents d’entretien qualifiés qui sont formés aux techniques de nettoyage propres à vos types de locaux.  Pour satisfaire tous vos besoins en matière d’entretien ménager, G.E.M vous offre un service d’entretien et de nettoyage résidentiel de haute qualité à un prix parfaitement compétitif. Tout le ménage de votre domicile est pensé et réalisé dans ses moindres détails.  Lorsque vous remettez l’entretien de votre maison aux mains méticuleuses de G.E.M, rien n’est laissé au hasard.  Chaque pièce est importante, et ce dans ses moindres recoins. Non seulement nous allions notre savoir-faire à une efficacité qui dépassera vos attentes, mais chaque entretien ménager est effectué avec la plus grande discrétion.Service d’entretien et de nettoyage résidentielune entreprise de nettoyage industriel spécialisée dans la propreté  de vos locaux professionnels (immeubles, bureaux, locaux industriels).L’équipe est composée d’agents de nettoyage qualifiés prêts à intervenir sur tous les types de chantiers,, après l’élaboration d’un devis de nettoyage complet et précis, qu’il s’agisse d’une intervention de nettoyage particulier ou d’un nettoyage de locaux professionnels.De l’entretien courant des sols, vitres et meubles - au nettoyage très spécifique de matériel professionnel ; G,E.M  prend en charge l’intégralité de votre entretien ménager. Que ce soit pour vos bureaux, hôtels et surfaces de ventes qui demandent un entretien méticuleux car représentants de votre enseigne ou espaces communs d’immeubles qui connaissent un fort taux de passage, G.E.M MÉNAGE répond à vos besoins. propose des prestations avec une équipe hautement qualifiée ainsi que du matériel de nettoyage répondant à tous les besoins de nettoyage dans les bureaux.Les prestations sont effectuées par des agents d’entretien qualifiés qui sont formés aux techniques de nettoyage propres à vos types de locaux. Il est important de noter que les intervenants sont employés directement par g.e.m  et non par vos soins Si beaucoup pensent que le nettoyage de bureaux se résume à passer l’aspirateur, nettoyer les vitrines et vider les poubelles, Financement Sans Intérêt par G.E.M .  Un dépôt est obligatoire   Un Investissement de 24 000$ Vous Rapporte (4800$ et plus de Revenus par Mois)!   Matériel et formation fourni   Nous aidons les personnes désireuses d’être propriétaires d’entreprises prospères à devenir des professionnels du nettoyage commercial et de la maintenance. En rejoignant notre réseau d’entreprises, vous bénéficierez d’un avantage concurrentiel ainsi que d’une aide apportée par un modèle d’affaires éprouvé vous assurant de travailler avec un leader du domaine disposant de l’expérience et la stabilité.   G.E.M Ménage vous offre l'opportunité de travailler pendant la journée de lundi a vendredi .   G.E.M Vous propose des contrats d'entretien ménager avec des horaires souples et un revenu garanti.   Pour les personnes libres,les nouveaux arrivants ou les sans-emplois G.E.M peut favoriser votre accès au marché du travail !   G.E.M vous propose des contrats stables et rémunérateurs!   Dans le secteur résidentiel idéal pour un couple, ou un homme seul dans le secteur commercial  Vous débuter des maintenant   Des techniques et méthodes de travail éprouvées.  Une aide à la constitution ou à l’enregistrement de leur entreprise.  Des territoires d’exercice protégés.  Entreprise clés en main.  Un garantie qui protège votre investissement   Exigences de l’entrée de notre réseau :  Les demandes sont examinées attentivement et une enquête relative à la candidature est menée.  Les candidats doivent passer une entrevue de sélection.  Avant tout début d’activité, les candidats doivent assister à des sessions de formation.   Au G.E.M. nous nous assurons que nos franchisés puissent offrir à leurs clients un service professionnel d’une qualité supérieure à celle de la concurrence.  Franchise disponible au résidentiel et commercial   N'hésitez pas à nous contacter  469 Jean-Talon Ouest Suite # 222  Montreal QC  gemmenage.net  gemmenage.com

Saved as a favorite, I love your web site!  Here is my page  Аренда квартир в Аликанте - lolideas.com/.../

社交媒体管理
12/17/2017 9:44:26 AM #

Our clients benefit from a wealth of communications resources, state-of-the-art technologies, and award-winning professionals from a broad range of disciplines and backgrounds.  Also visit my website ::  社交媒体管理 - http://www.instinctif.asia/index1.html

Add comment