I got this working without resorting to Attached Properties by using the x:Name
property in the Xaml and then passing this on to my CommandParameter as a MultiBinding along with the Tag. From Front to Back:
In my View:
<Button Content="{Binding PropertyA}" x:Name="PropertyA" Tag="{x:Type Types:TicketTypeA}" Style="{StaticResource LinkButton}"/>
<Button Content="{Binding PropertyB}" x:Name="PropertyB" Tag="{x:Type Types:TicketTypeB}" Style="{StaticResource LinkButton}"/>
In the style for each button:
<Style x:Key="LinkButton" TargetType="Button">
<Setter Property="Command" Value="{Binding DataContext.ListHistoryCommand, Mode=OneWay, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}" />
<Setter Property="CommandParameter">
<Setter.Value>
<MultiBinding Converter="{StaticResource propertyConverter}">
<MultiBinding.Bindings>
<Binding Path="Tag" RelativeSource="{RelativeSource Mode=Self}"/>
<Binding Path="Name" RelativeSource="{RelativeSource Mode=Self}"/>
</MultiBinding.Bindings>
</MultiBinding>
</Setter.Value>
</Setter>
In my Converter:
public class PropertyConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
//Type t = values[0] as Type;
//String propName = values[1] as string;
Type t = values[0] as Type;
if (t == null)
return typeof(TicketBase);
String s = values[1] as String;
return new Tuple<Type,String>(t,s);
}
}
In my View Model:
private void ListHistory(object o)
{
if (Tickets.Count == 0)
return;
var tuple = o as Tuple<Type,String>;
// Now write some code to dynamically select the propertyName (tuple.Item2) from the type (tuple.Item1)
}
I am now receiving the Type and PropertyName in my Command. Now, I just need to compile a lambda expression at runtime to dynamically Select the PropertyName from the Type.