Se avete visto un qualsiasi frammento di XAML è probabile che abbiate incontrato una markup extension, ovvero quelle particolari definizioni racchiuse tra parentesi graffe (es: {x:Null}).
Oggi mi è venuto comodo visualizzare in un texblock il valore di un setting e per far questo ho sfruttato la possibilità di definire delle custom markup extensions semplicemente creando delle classi che ereditano da MarkupExtension.

[MarkupExtensionReturnType(typeof(string))] public class StringSettingExtension:MarkupExtension { public StringSettingExtension():base(){} public StringSettingExtension(string propertyName) { if (string.IsNullOrEmpty(propertyName)) throw new ArgumentNullException("propertyName", "Parameter can't be null."); else this.PropertyName = propertyName; } public string PropertyName { get; set; } public override object ProvideValue(IServiceProvider serviceProvider) { SettingsProperty data = Properties.Settings.Default.Properties[this.PropertyName]; return (data == null) ? this.PropertyName + " not found" : data.DefaultValue; } }

A questo punto posso associare l'impostazione direttamente in XAML...

<Window x:Class="D04_MarkupExtension.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:my="clr-namespace:D04_MarkupExtension" Title="Window1" Height="300" Width="300"> <Grid> <TextBlock Text="{my:StringSetting MyProperty}" Height="21" Margin="78,63,80,0" Name="textBox1" VerticalAlignment="Top" /> </Grid> </Window>

Cool!

Technorati Tags: ,