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:
WPF,
MarkupExtension