What’s New In Silverlight 5Jeff BrandDeveloper and Platform TeamMicrosoftjbrand@microsoft.com | slickthought.net | @jabrand
HighlightsIE 10
HTML 5
Improved Graphics Acceleration
Speed Improvements
Mango
16 more languages
Nokia
Cut &Paste; Multi Tasking; Dev Tool Improvements
IE speed improvements (22 fps vs. 11 fps for Android and 2 fps for iPhone)
Silverlight 5
Beta Delivered
Rich Media
Hardware Video Decode
XNA for 3D Rendering
NUI & Windows Touch
Surface SDK 2 for Surface and Windows Touch Enables Devices
Tons of other topics!MiX content onlinehttp://www.microsoft.com/events/mix/default.aspxhttp://ie.microsoft.com/testdrive/http://www.silverlight.net/getstarted/silverlight-5-beta/http://www.microsoft.com/web/http://orchard.codeplex.com/
What’s New in Silverlight 5
AgendaMVVM Databinding EnhancementsBinding In Style SettersImplicitDataTemplatesRelativeSource Ancestor BindingsCustom Markup ExtensionsDatabinding DebuggingDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & MediaUnrestricted File AccessTrusted Apps In-BrowserGroup PolicyP/InvokeHTML supportMultiple Windows64-bit
Focused on your top asks:User Voice:
DataBinding EnhancementsEnabling MVVM, but also just more productive
Layers Of Our ApplicationsPresentation logicUI (XAML)UI (XAML)OrdersUI (XAML)PeopleAppointmentsCode Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Not reusableHow to test?How to reuse?How can the designer update the UIHow to provide different viewsLaptop/DesktopTablet/Slate w/TouchPhoneModelsServicesJSONRIAEFPOCOXMLRESTWeb ServicesWeb ServicesWCFVehiclesTaxPersonVehicleCalendarPeopleSchedulesShippingOrdersDataSQL ServerOracleTelco SwitchesMedia Streams
MVVMTest FrameworkVisual Studio Team TestLaptop/DesktopAppointmentsTablet/SlateAppointmentsPhoneAppointmentsCode Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Aggregation of data & services for your presentation logicClass LibrariesViewModel(VM.cs/vbTest API w/VSTTLeverage logic across UIsDesigner parties on XAMLSkin across varied form factorsLaptop/DesktopTablet/Slate w/TouchPhoneModelsServicesJSONRIAEFPOCOXMLRESTWeb ServicesWeb ServicesWCFVehiclesTaxPersonVehicleCalendarPeopleSchedulesShippingOrdersDataSQL ServerOracleTelco SwitchesMedia Streams
Benefits of MVVM
MVVM EnhancementsSilverlight 5 Binding In Style SettersImplicitDataTemplatesRelativeSource Ancestor BindingsCustom Markup ExtensionsDatabinding DebuggingDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & MediaReduce the need for UI codeHow to reduce code?Enhance DataBinding
MVVM EnhancementsBinding In Style SettersImplicitDataTemplatesRelativeSource Ancestor BindingsCustom Markup ExtensionsDatabinding DebuggingDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
Binding Style SettersHow do I change styles without shipping new XAML?Can I set the styles in the database?demo
Binding Style Setters How It WorksCreate a Class to expose your valuesInstance the Class in your ResourcesBind the value to the instanced resourcenamespaceMyProject.Styles {  publicclassMyAppStyles: INotifyPropertyChanged{publicBrushForegroundColor{get{ return _foregroundColor; }set { _foregroundColor = value;NotifyPropertyChanged("ForegroundColor");<ResourceDictionaryxmlns:stylesNS="clr-namespace:MyProject.Styles"><stylesNS:MyAppStyles x:Key=“MyAppStyles"/><StyleTargetType="TextBlock"><Setter Property="Foreground"Value="{BindingForegroundColor}, Source={StaticResourceMyAppStyles}”
MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSourceAncestor BindingsDatabindingDebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
Implicit Data Templates<Application.Resources><ResourceDictionary><DataTemplatex:Key="vehiclesDataTemplate">DataType="models:Vehicle"><Image Source="Vehicle.png"/></DataTemplate>    </ResourceDictionary></Application.Resources><Application.Resources>	<ResourceDictionary><DataTemplatex:Key="stateDataTemplate">DataType=“models:State"><Grid><StackPanel Orientation="Horizontal"><TextBlock Text="{BindingStateCode}"/><TextBlock Text="{BindingStateName}"/></StackPanel></Grid></DataTemplate>	</ResourceDictionary></Application.Resources><Application.Resources><ResourceDictionary><!--Default Vehicle DataTemplate--><DataTemplateDataType="models:Vehicle"><Image Source="Vehicle.png"/></DataTemplate><DataTemplateDataType="models:Car"><Image Source="Car.png"/></DataTemplate><DataTemplateDataType="models:Truck"><Image Source="Truck.png"/></DataTemplate><DataTemplateDataType="models:Motorcycle"><Image Source="Motorcycle.png"/></DataTemplate>	</ResourceDictionary></Application.Resources><Application.Resources>	<ResourceDictionary><DataTemplate x:Key=“StatesDataTemplate"><Grid><StackPanel Orientation="Horizontal"><TextBlock Text="{BindingStateCode}"/><TextBlock Text="{BindingStateName}"/></StackPanel></Grid></DataTemplate>	</ResourceDictionary></Application.Resources>Template Based On TypeHeterogeneous CollectionsWith Inheritance Hierarchy demo
MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabindingDebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
Relative Source Ancestor BindingHow do I bind to data up the visual tree?namespaceSLInsurance.ViewModels{publicclassAppointmentsViewModel{publicObservableCollection<Appointments> Appointments{ get; set; }  publicObservableCollection<Status> Status{get; set; }namespaceSLInsurance.Views{publicpartialclassAppointmentView: UserControl {...this.DataContext= newViewModels.AppointmentViewModel();<ListBoxItemsSource="{BindingPath=Appointments}"><ListBox.ItemTemplate><DataTemplate><Grid ...	<TextBlockText="{BindingTime}" …	<ComboBoxItemsSource="{BindingDataContext.Status,RelativeSource={RelativeSourceFindAncestorAncestorType=UserControl,		  Mode=FindAncestor}}"
Relative Source Ancestor BindingUsed For Control Hierarchy Binding As Well<DataTemplate x:Key="StateComboBoxDataTemplate">  <StackPanel Orientation="Horizontal">    <TextBlock Text="{BindingStateCode}"Margin="0,0,5,0"/>    <TextBlock Text="{BindingStateName}"Visibility="{BindingIsDropDownOpen,RelativeSource={RelativeSourceFindAncestorAncestorType=ComboBox},               Converter={StaticResourceBoolToVisibilityConverter}}"/></StackPanel>demo
MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
DataBinding Debuggingdemo
DataBinding DebuggingXAML BreakpointsBreak when objects are bound, such as Grid Cycling((System.Windows.Data.Debugging.BindingDebugState)BindingState).Error != nullLocals:Dig into what’s working, what’s notFull Debugging SupportBound Instance & TypeValues of the Final SourcePipelineInitial
AfterValue
AfterStringFormat
AfterTypeConversion
…MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
Custom Markup Extensionsdemo
Custom Markup ExtensionsHow do I get my event handler code out of my Code Behind<ListBoxx:Name="appointmentsListbox"ItemsSource="{Binding Appointments}"SelectionChanged="OnAppointmentsListbox_SelectionChanged">UI (XAML)publicpartialclassAppointments: UserControl{privatevoidOnAppointmentsListbox_SelectionChanged(object sender, SelectionChangedEventArgs e){this.DataService.GetClaimById(GetClaimsCallback, ((AdjusterAppointment) (this.appointmentsListbox.SelectedItem)).Claim_Id); 	}privatevoidGetClaimsCallback(ObservableCollection<Claim> claims) {this.AppoinmentsListBox.Items.Add(claims[0]);Code Behind (XAML.cs/vb)ViewModel(VM.cs/vbServicesModelspublicvoidGetClaimById(Action<ObservableCollection<Claim>> callback, stringclaim_Id) {varquery = DataContext.GetClaimByIdQuery(claim_Id);	_getClaimCallback = callback;	_claimLoadOperation = DataContext.Load<Claim>(query);	…Data
Custom Markup ExtensionHow It WorkspublicclassMethodInvokeExtension: IMarkupExtension<object> {	// Properties Exposed in XAML as Intellisense LovepublicStringMethod{ get; set; }	// Invoked by the XAML Parser @ runtime	publicobjectProvideValue(IServiceProviderserviceProvider) {<UserControl x:Class=“AppointmentsView"xmlns:MyUtils="clr-namespace:SLInsurance;assembly=SLInsurance">...<StackPanel x:Name="LayoutRoot">  <ComboBoxName=“appointmentsListBox"SelectionChanged="{MyUtils:MethodInvoke Method=OnAppointmentChanged}"
MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
DataContextChanged EventIt just worksIncrease Memory Efficiency “handle references”this.DataContextChanged += View_DataContextChanged;…voidView_DataContextChanged(objectsender, DependencyPropertyChangedEventArgs e) {INotifyPropertyChanged customer;    customer = e.OldValueasINotifyPropertyChanged;if (customer != null)customer.PropertyChanged -= customer_PropertyChanged;    customer = e.NewValueasINotifyPropertyChanged;if (customer != null)customer.PropertyChanged += customer_PropertyChanged;}
MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
UpdateSourceTriggerHow can I get key stroke changes?<TextBoxName="vinTextBox"Text="{BindingSelectedClaim.InsuredVIN, Mode=TwoWay}"TextChanged="vinTextBox_TextChanged"UI (XAML)privatevoidvinTextBox_TextChanged(object sender, TextChangedEventArgs e) {Helpers.VinCarInfocarInfo = Helpers.VINParser.Parse(vinTextBox.Text);this.vehicleYearsAutoComplete.Text = carInfo.Year.Value.ToString();this.vehicleMakeAutoComplete.Text = carInfo.Make;this.vehicleModelComboBox.SelectedValue = carInfo.Model;Code Behind (XAML.cs/vb)ViewModel(VM.cs/vbpublicvoidLoadVehicleYears() {this.DataService.GetVehicleYears(GetVehicleYearsCallback);}publicvoidLoadVehicleMakes(Nullable<int> year) {if(year.HasValue) {this.DataService.GetVehicleMakes(GetVehicleMakessCallback, year.Value);…publicvoidLoadVehicleModels(Nullable<int> year, string make) {if(year.HasValue) {this.DataService.GetVehicleModels(GetVehicleModelssCallback, year.Value, make);ServicesModelspublicvoidGetVehicleMakes(Action<ObservableCollection<string>> callback, int year) {            _getVehicleMakesCallback = callback;this.SearchServiceClient.GetVehicleMakesCompleted += OnGetVehicleMakesCompleted;this.SearchServiceClient.GetVehicleMakesAsync(year);}Data
UpdateSourceTriggerMoving code from the UI to the testable ViewModel<TextBoxName="vinTextBox"Text="{BindingSelectedClaim.InsuredVIN, Mode=TwoWay}"UpdateSourceTrigger=PropertyChanged}"UI (XAML)Code Behind (XAML.cs/vb)ViewModel(VM.cs/vbvoidOnClaimPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {switch(e.PropertyName) {case"InsuredVIN":ParseVIN();break;…private voidParseVIN() {Helpers.VinCarInfocarInfo = Helpers.VINParser.Parse(this.SelectedClaim.InsuredVIN);this.SelectedClaim.InsuredYear= carInfo.Year;this.SelectedClaim.InsuredMake= carInfo.Make;this.SelectedClaim.InsuredModel= carInfo.Model;…ServicesModelsData
UpdateSourceTriggerdemo
MVVM EnhancementsBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
WCF RIA Services for Silverlight 5Complex Types (SP1)Custom ClientCode Gen(SP1)EF Code First(coming soon)DateTimeOffsetMVVM Support
But Wait, There’s MoreBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & MediaTextPrintingMedia
Text EnhancementsCum sociisnatoquepenatibus et magnis dis parturient montes, nasceturridiculus mus. Pellentesque habitant morbitristiquesenectus et netus et malesuada fames ac turpisegestas. Vivamusenim dolor, molestie at auctor id, auctorultrices nisi. Curabitururnalorem, luctushendreritdapibusquis, facilisissedorci. Aliquamnuncmassa, placerat id pretiumeget, luctus sit amet diam. Vestibulum ante ipsumprimis in faucibusorciluctus et ultricesposuerecubiliaCurae; Pellentesquefermentumneque at nislbibendumcursus. Aliquamsollicitudineliteununcplacerat et pulvinarmauriscondimentum. Donecsedsapienelit, velcondimentumjusto. Cum sociisnatoquepenatibus et magnis dis parturient montes, nasceturridiculus mus. Ututodionunc. Maecenas vitae quam urna. Nulla a ante imperdietsemtinciduntporta. Donecesttellus, imperdietegetullamcorpereu, laoreetvellorem. FusceornarenislLinked Text ContainersFlow Rich Text from one container to anotherDynamically flows on resizemollis lacus cursus semper suscipiturnaultricies. Phasellus magna justo, commodosodalesauctornec, euismod vitae purus.Vivamusdignissimfeugiattristique. Crasaliquetsapien non justosagittisimperdiet. In a velitmauris, eusodales magna. Fuscelectuslectus, blandit non semper vitae, cursusutpurus. Vestibulumquisaliquamaugue. Morbiid estseddiamimperdietpretium vitae a turpis. Sedvelsapienarcu. Loremipsum dolor sit amet, consecteturadipiscingelit. Suspendisse ac diamut ante imperdietlacinia. Integer sit ametjusto sit amettortorfacilisis id sit ametaugue. Etiam in risusveleratmolestieviverra. Suspendissepellentesquebibendumsagittis. Etiamconvallisleo at dui ornareegetelementumodio dictum. Integer tempus ultricieslectus. Maecenas dictum ipsum id nisladipiscingeuiaculistortorsuscipit. Etiamsedsapienneque, in ultricies magna. Aliquam in nisl et lectusbibendumvestibulum. Donecsuscipit, velit vitae convallisaccumsan, tortor magna dignissimpurus, sedconvallisorcitortorsed sem. Crasquisest id turpiscongueporta. Proinpharetramattisnullaquisvestibulum.<RichTextBoxOverflowContentTarget="{Binding ElementName=overflow1}"><RichTextBoxOverflow x:Name="overflow1"OverflowContentTarget="{BindingElementName=overflow2}"><RichTextBoxOverflow x:Name="overflow2"OverflowContentTarget="{BindingElementName=overflow3}">...Utin sapien id maurisegestasrhoncus a egeterat. Vivamustempor tempus quam facilisisdapibus. Curabiturvolutpatipsum vitae tortortinciduntsedmalesuadaurnatincidunt. Quisqueporttitor, neque id malesuadafaucibus, quam leoauctornisl, quisaliquetenim ligula utodio. Etiamvelturpis magna. Crasiaculisest sem. Pellentesquemalesuada, liberoeutemportempor, tellusipsumdignissimsapien, id facilisisaugueipsum vitae quam. Crasquisimperdietleo. In orcipurus, placerat ac ultricies in, elementum vitae turpis. Nunclectussapien, sagittis id luctusut, hendreritutmassa. Sedpurussapien, pharetra id faucibusnec, semper id lacus. Phasellus et lectusleo, egetadipiscinglorem. Donecfermentum lacus dolor. Etiamlaoreettristique nisi, sit ametconvallisnunclacinia et. Integer aliquam, magna ac porttitorcongue, estliberoconsectetur lacus, lobortisportaorcirisusnec magna. Integer sapienpurus, volutpat sit ametvehicula vitae, accumsan a felis. Sed a nullavelenimlaoreetconsequat. Nullautnequemassa, at semper enim.risusnec magna. Integer sapienpurus, volutpat sit ametvehicula vitae, accumsan a felis. Sed a nullavelenimlaoreetconsequat. Nullautnequemassa, at semper enim.
Text ClaritySharpens text by snapping with pixelsGreat for low res devices
BitmapVectorVector Printing

Silverlight 5 whats new overview

  • 1.
    What’s New InSilverlight 5Jeff BrandDeveloper and Platform TeamMicrosoftjbrand@microsoft.com | slickthought.net | @jabrand
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
    Cut &Paste; MultiTasking; Dev Tool Improvements
  • 16.
    IE speed improvements(22 fps vs. 11 fps for Android and 2 fps for iPhone)
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
    XNA for 3DRendering
  • 22.
  • 23.
    Surface SDK 2for Surface and Windows Touch Enables Devices
  • 24.
    Tons of othertopics!MiX content onlinehttp://www.microsoft.com/events/mix/default.aspxhttp://ie.microsoft.com/testdrive/http://www.silverlight.net/getstarted/silverlight-5-beta/http://www.microsoft.com/web/http://orchard.codeplex.com/
  • 25.
    What’s New inSilverlight 5
  • 26.
    AgendaMVVM Databinding EnhancementsBindingIn Style SettersImplicitDataTemplatesRelativeSource Ancestor BindingsCustom Markup ExtensionsDatabinding DebuggingDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & MediaUnrestricted File AccessTrusted Apps In-BrowserGroup PolicyP/InvokeHTML supportMultiple Windows64-bit
  • 27.
    Focused on yourtop asks:User Voice:
  • 28.
    DataBinding EnhancementsEnabling MVVM,but also just more productive
  • 29.
    Layers Of OurApplicationsPresentation logicUI (XAML)UI (XAML)OrdersUI (XAML)PeopleAppointmentsCode Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Not reusableHow to test?How to reuse?How can the designer update the UIHow to provide different viewsLaptop/DesktopTablet/Slate w/TouchPhoneModelsServicesJSONRIAEFPOCOXMLRESTWeb ServicesWeb ServicesWCFVehiclesTaxPersonVehicleCalendarPeopleSchedulesShippingOrdersDataSQL ServerOracleTelco SwitchesMedia Streams
  • 30.
    MVVMTest FrameworkVisual StudioTeam TestLaptop/DesktopAppointmentsTablet/SlateAppointmentsPhoneAppointmentsCode Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Code Behind (XAML.cs/vb)Aggregation of data & services for your presentation logicClass LibrariesViewModel(VM.cs/vbTest API w/VSTTLeverage logic across UIsDesigner parties on XAMLSkin across varied form factorsLaptop/DesktopTablet/Slate w/TouchPhoneModelsServicesJSONRIAEFPOCOXMLRESTWeb ServicesWeb ServicesWCFVehiclesTaxPersonVehicleCalendarPeopleSchedulesShippingOrdersDataSQL ServerOracleTelco SwitchesMedia Streams
  • 31.
  • 32.
    MVVM EnhancementsSilverlight 5Binding In Style SettersImplicitDataTemplatesRelativeSource Ancestor BindingsCustom Markup ExtensionsDatabinding DebuggingDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & MediaReduce the need for UI codeHow to reduce code?Enhance DataBinding
  • 33.
    MVVM EnhancementsBinding InStyle SettersImplicitDataTemplatesRelativeSource Ancestor BindingsCustom Markup ExtensionsDatabinding DebuggingDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 34.
    Binding Style SettersHowdo I change styles without shipping new XAML?Can I set the styles in the database?demo
  • 35.
    Binding Style SettersHow It WorksCreate a Class to expose your valuesInstance the Class in your ResourcesBind the value to the instanced resourcenamespaceMyProject.Styles { publicclassMyAppStyles: INotifyPropertyChanged{publicBrushForegroundColor{get{ return _foregroundColor; }set { _foregroundColor = value;NotifyPropertyChanged("ForegroundColor");<ResourceDictionaryxmlns:stylesNS="clr-namespace:MyProject.Styles"><stylesNS:MyAppStyles x:Key=“MyAppStyles"/><StyleTargetType="TextBlock"><Setter Property="Foreground"Value="{BindingForegroundColor}, Source={StaticResourceMyAppStyles}”
  • 36.
    MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSourceAncestor BindingsDatabindingDebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 37.
    Implicit Data Templates<Application.Resources><ResourceDictionary><DataTemplatex:Key="vehiclesDataTemplate">DataType="models:Vehicle"><ImageSource="Vehicle.png"/></DataTemplate> </ResourceDictionary></Application.Resources><Application.Resources> <ResourceDictionary><DataTemplatex:Key="stateDataTemplate">DataType=“models:State"><Grid><StackPanel Orientation="Horizontal"><TextBlock Text="{BindingStateCode}"/><TextBlock Text="{BindingStateName}"/></StackPanel></Grid></DataTemplate> </ResourceDictionary></Application.Resources><Application.Resources><ResourceDictionary><!--Default Vehicle DataTemplate--><DataTemplateDataType="models:Vehicle"><Image Source="Vehicle.png"/></DataTemplate><DataTemplateDataType="models:Car"><Image Source="Car.png"/></DataTemplate><DataTemplateDataType="models:Truck"><Image Source="Truck.png"/></DataTemplate><DataTemplateDataType="models:Motorcycle"><Image Source="Motorcycle.png"/></DataTemplate> </ResourceDictionary></Application.Resources><Application.Resources> <ResourceDictionary><DataTemplate x:Key=“StatesDataTemplate"><Grid><StackPanel Orientation="Horizontal"><TextBlock Text="{BindingStateCode}"/><TextBlock Text="{BindingStateName}"/></StackPanel></Grid></DataTemplate> </ResourceDictionary></Application.Resources>Template Based On TypeHeterogeneous CollectionsWith Inheritance Hierarchy demo
  • 38.
    MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabindingDebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 39.
    Relative Source AncestorBindingHow do I bind to data up the visual tree?namespaceSLInsurance.ViewModels{publicclassAppointmentsViewModel{publicObservableCollection<Appointments> Appointments{ get; set; } publicObservableCollection<Status> Status{get; set; }namespaceSLInsurance.Views{publicpartialclassAppointmentView: UserControl {...this.DataContext= newViewModels.AppointmentViewModel();<ListBoxItemsSource="{BindingPath=Appointments}"><ListBox.ItemTemplate><DataTemplate><Grid ... <TextBlockText="{BindingTime}" … <ComboBoxItemsSource="{BindingDataContext.Status,RelativeSource={RelativeSourceFindAncestorAncestorType=UserControl, Mode=FindAncestor}}"
  • 40.
    Relative Source AncestorBindingUsed For Control Hierarchy Binding As Well<DataTemplate x:Key="StateComboBoxDataTemplate"> <StackPanel Orientation="Horizontal"> <TextBlock Text="{BindingStateCode}"Margin="0,0,5,0"/> <TextBlock Text="{BindingStateName}"Visibility="{BindingIsDropDownOpen,RelativeSource={RelativeSourceFindAncestorAncestorType=ComboBox}, Converter={StaticResourceBoolToVisibilityConverter}}"/></StackPanel>demo
  • 41.
    MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 42.
  • 43.
    DataBinding DebuggingXAML BreakpointsBreakwhen objects are bound, such as Grid Cycling((System.Windows.Data.Debugging.BindingDebugState)BindingState).Error != nullLocals:Dig into what’s working, what’s notFull Debugging SupportBound Instance & TypeValues of the Final SourcePipelineInitial
  • 44.
  • 45.
  • 46.
  • 47.
    …MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 48.
  • 49.
    Custom Markup ExtensionsHowdo I get my event handler code out of my Code Behind<ListBoxx:Name="appointmentsListbox"ItemsSource="{Binding Appointments}"SelectionChanged="OnAppointmentsListbox_SelectionChanged">UI (XAML)publicpartialclassAppointments: UserControl{privatevoidOnAppointmentsListbox_SelectionChanged(object sender, SelectionChangedEventArgs e){this.DataService.GetClaimById(GetClaimsCallback, ((AdjusterAppointment) (this.appointmentsListbox.SelectedItem)).Claim_Id); }privatevoidGetClaimsCallback(ObservableCollection<Claim> claims) {this.AppoinmentsListBox.Items.Add(claims[0]);Code Behind (XAML.cs/vb)ViewModel(VM.cs/vbServicesModelspublicvoidGetClaimById(Action<ObservableCollection<Claim>> callback, stringclaim_Id) {varquery = DataContext.GetClaimByIdQuery(claim_Id); _getClaimCallback = callback; _claimLoadOperation = DataContext.Load<Claim>(query); …Data
  • 50.
    Custom Markup ExtensionHowIt WorkspublicclassMethodInvokeExtension: IMarkupExtension<object> { // Properties Exposed in XAML as Intellisense LovepublicStringMethod{ get; set; } // Invoked by the XAML Parser @ runtime publicobjectProvideValue(IServiceProviderserviceProvider) {<UserControl x:Class=“AppointmentsView"xmlns:MyUtils="clr-namespace:SLInsurance;assembly=SLInsurance">...<StackPanel x:Name="LayoutRoot"> <ComboBoxName=“appointmentsListBox"SelectionChanged="{MyUtils:MethodInvoke Method=OnAppointmentChanged}"
  • 51.
    MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 52.
    DataContextChanged EventIt justworksIncrease Memory Efficiency “handle references”this.DataContextChanged += View_DataContextChanged;…voidView_DataContextChanged(objectsender, DependencyPropertyChangedEventArgs e) {INotifyPropertyChanged customer; customer = e.OldValueasINotifyPropertyChanged;if (customer != null)customer.PropertyChanged -= customer_PropertyChanged; customer = e.NewValueasINotifyPropertyChanged;if (customer != null)customer.PropertyChanged += customer_PropertyChanged;}
  • 53.
    MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChanged EventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 54.
    UpdateSourceTriggerHow can Iget key stroke changes?<TextBoxName="vinTextBox"Text="{BindingSelectedClaim.InsuredVIN, Mode=TwoWay}"TextChanged="vinTextBox_TextChanged"UI (XAML)privatevoidvinTextBox_TextChanged(object sender, TextChangedEventArgs e) {Helpers.VinCarInfocarInfo = Helpers.VINParser.Parse(vinTextBox.Text);this.vehicleYearsAutoComplete.Text = carInfo.Year.Value.ToString();this.vehicleMakeAutoComplete.Text = carInfo.Make;this.vehicleModelComboBox.SelectedValue = carInfo.Model;Code Behind (XAML.cs/vb)ViewModel(VM.cs/vbpublicvoidLoadVehicleYears() {this.DataService.GetVehicleYears(GetVehicleYearsCallback);}publicvoidLoadVehicleMakes(Nullable<int> year) {if(year.HasValue) {this.DataService.GetVehicleMakes(GetVehicleMakessCallback, year.Value);…publicvoidLoadVehicleModels(Nullable<int> year, string make) {if(year.HasValue) {this.DataService.GetVehicleModels(GetVehicleModelssCallback, year.Value, make);ServicesModelspublicvoidGetVehicleMakes(Action<ObservableCollection<string>> callback, int year) { _getVehicleMakesCallback = callback;this.SearchServiceClient.GetVehicleMakesCompleted += OnGetVehicleMakesCompleted;this.SearchServiceClient.GetVehicleMakesAsync(year);}Data
  • 55.
    UpdateSourceTriggerMoving code fromthe UI to the testable ViewModel<TextBoxName="vinTextBox"Text="{BindingSelectedClaim.InsuredVIN, Mode=TwoWay}"UpdateSourceTrigger=PropertyChanged}"UI (XAML)Code Behind (XAML.cs/vb)ViewModel(VM.cs/vbvoidOnClaimPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) {switch(e.PropertyName) {case"InsuredVIN":ParseVIN();break;…private voidParseVIN() {Helpers.VinCarInfocarInfo = Helpers.VINParser.Parse(this.SelectedClaim.InsuredVIN);this.SelectedClaim.InsuredYear= carInfo.Year;this.SelectedClaim.InsuredMake= carInfo.Make;this.SelectedClaim.InsuredModel= carInfo.Model;…ServicesModelsData
  • 56.
  • 57.
    MVVM EnhancementsBinding InStyle SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & Media
  • 58.
    WCF RIA Servicesfor Silverlight 5Complex Types (SP1)Custom ClientCode Gen(SP1)EF Code First(coming soon)DateTimeOffsetMVVM Support
  • 59.
    But Wait, There’sMoreBinding In Style SettersImplicit DataTemplatesRelativeSource Ancestor BindingsDatabinding DebuggingCustom Markup ExtensionsDataContextChangedEventUpdateSourceTriggerWCF RIA Services EnhancementsText, Printing & MediaTextPrintingMedia
  • 60.
    Text EnhancementsCum sociisnatoquepenatibuset magnis dis parturient montes, nasceturridiculus mus. Pellentesque habitant morbitristiquesenectus et netus et malesuada fames ac turpisegestas. Vivamusenim dolor, molestie at auctor id, auctorultrices nisi. Curabitururnalorem, luctushendreritdapibusquis, facilisissedorci. Aliquamnuncmassa, placerat id pretiumeget, luctus sit amet diam. Vestibulum ante ipsumprimis in faucibusorciluctus et ultricesposuerecubiliaCurae; Pellentesquefermentumneque at nislbibendumcursus. Aliquamsollicitudineliteununcplacerat et pulvinarmauriscondimentum. Donecsedsapienelit, velcondimentumjusto. Cum sociisnatoquepenatibus et magnis dis parturient montes, nasceturridiculus mus. Ututodionunc. Maecenas vitae quam urna. Nulla a ante imperdietsemtinciduntporta. Donecesttellus, imperdietegetullamcorpereu, laoreetvellorem. FusceornarenislLinked Text ContainersFlow Rich Text from one container to anotherDynamically flows on resizemollis lacus cursus semper suscipiturnaultricies. Phasellus magna justo, commodosodalesauctornec, euismod vitae purus.Vivamusdignissimfeugiattristique. Crasaliquetsapien non justosagittisimperdiet. In a velitmauris, eusodales magna. Fuscelectuslectus, blandit non semper vitae, cursusutpurus. Vestibulumquisaliquamaugue. Morbiid estseddiamimperdietpretium vitae a turpis. Sedvelsapienarcu. Loremipsum dolor sit amet, consecteturadipiscingelit. Suspendisse ac diamut ante imperdietlacinia. Integer sit ametjusto sit amettortorfacilisis id sit ametaugue. Etiam in risusveleratmolestieviverra. Suspendissepellentesquebibendumsagittis. Etiamconvallisleo at dui ornareegetelementumodio dictum. Integer tempus ultricieslectus. Maecenas dictum ipsum id nisladipiscingeuiaculistortorsuscipit. Etiamsedsapienneque, in ultricies magna. Aliquam in nisl et lectusbibendumvestibulum. Donecsuscipit, velit vitae convallisaccumsan, tortor magna dignissimpurus, sedconvallisorcitortorsed sem. Crasquisest id turpiscongueporta. Proinpharetramattisnullaquisvestibulum.<RichTextBoxOverflowContentTarget="{Binding ElementName=overflow1}"><RichTextBoxOverflow x:Name="overflow1"OverflowContentTarget="{BindingElementName=overflow2}"><RichTextBoxOverflow x:Name="overflow2"OverflowContentTarget="{BindingElementName=overflow3}">...Utin sapien id maurisegestasrhoncus a egeterat. Vivamustempor tempus quam facilisisdapibus. Curabiturvolutpatipsum vitae tortortinciduntsedmalesuadaurnatincidunt. Quisqueporttitor, neque id malesuadafaucibus, quam leoauctornisl, quisaliquetenim ligula utodio. Etiamvelturpis magna. Crasiaculisest sem. Pellentesquemalesuada, liberoeutemportempor, tellusipsumdignissimsapien, id facilisisaugueipsum vitae quam. Crasquisimperdietleo. In orcipurus, placerat ac ultricies in, elementum vitae turpis. Nunclectussapien, sagittis id luctusut, hendreritutmassa. Sedpurussapien, pharetra id faucibusnec, semper id lacus. Phasellus et lectusleo, egetadipiscinglorem. Donecfermentum lacus dolor. Etiamlaoreettristique nisi, sit ametconvallisnunclacinia et. Integer aliquam, magna ac porttitorcongue, estliberoconsectetur lacus, lobortisportaorcirisusnec magna. Integer sapienpurus, volutpat sit ametvehicula vitae, accumsan a felis. Sed a nullavelenimlaoreetconsequat. Nullautnequemassa, at semper enim.risusnec magna. Integer sapienpurus, volutpat sit ametvehicula vitae, accumsan a felis. Sed a nullavelenimlaoreetconsequat. Nullautnequemassa, at semper enim.
  • 61.
    Text ClaritySharpens textby snapping with pixelsGreat for low res devices
  • 62.

Editor's Notes

  • #3 Separation patternSeparates Design/Presentation from Business LogicData binding (XAML)Unit testingSeparation of concernsDesigner and developer symbiosisConsistent patternMaintainable Scalable
  • #29 Add:StringFormatFallBackValueTargetNullValueShow PipelineAdd ConverterShow the converterBreakpoint in the converterLastCompletedStageCan’t step into the different binding stagesCould I set the breakpoint conditional stage to the binding stage?
  • #32 Get w/Mark Harper on various use cases - Try demoing another scenarioHelpers.InvokeExtension
  • #40 Early head start with SP1
  • #41 Chinese