Le attached properties sono un meccanismo "furbo" per arricchire elementi WPF con proprietà che, sebbene memorizzate nell'oggetto stesso, sono definite in un altro elemento.
Supponiamo di avere la necessità di aggiungere ad un Button una proprietà CustomValue ed usarla in XAML.
Definisco una classe ButtonExtender che espone un attached property CustomValue:

.
   1:  namespace D00C.AttachedProperties
   2:  {
   3:    public static class ButtonExtender
   4:    {
   5:      public static readonly DependencyProperty
   6:        CustomValueProperty = DependencyProperty.RegisterAttached(
   7:        "CustomValue", typeof(int), typeof(ButtonExtender));
   8:   
   9:      public static int GetCustomValue (DependencyObject dp)
  10:      {
  11:        return (int)dp.GetValue(CustomValueProperty);
  12:      }
  13:   
  14:      public static void SetCustomValue (DependencyObject dp, int value)
  15:      {
  16:        dp.SetValue(CustomValueProperty, value);
  17:      }
  18:    }
  19:  }

E la utilizzo in XAML:

.
   1:  <Window x:Class="D00C.AttachedProperties.Window1"
   2:      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   3:      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   4:     xmlns:y="clr-namespace:D00C.AttachedProperties" Title="Demo" Height="300" Width="300" Name="win" >
   5:      <StackPanel>
   6:       <Button y:ButtonExtender.CustomValue="21" Margin="50" Click="OnClick" x:Name="btn">Hello</Button>
   7:       <TextBox Text="{Binding ElementName=btn, Path=(y:ButtonExtender.CustomValue)}" Width="100" Height="50" x:Name="txt" />
   8:     </StackPanel>
   9:  </Window>
.
   1:  public void OnClick (object sender, RoutedEventArgs e)
   2:      {
   3:        Button btn = (Button)sender;
   4:        int value = ButtonExtender.GetCustomValue(btn);    
   5:      }

Notate l'uso delle parentesi nell'utilizzo dell'attached property via databinding.