2011-05-15 31 views
0

使用WPF,我想将GroupBox的头绑定到多态类的类型名。因此,如果我有一个名为Element的类以及两个从Element派生的类,例如BasicElement和AdvancedElement,我希望GroupBox的标题说“BasicElement”或“AdvancedElement”。这里是我用于GroupBox的xaml。它是由ItemsControl使用的DataTemplate的一部分。我希望在XAML中代替Path = DerivedTypeNameOf(group),其中group是groups数组中的每个组。WPF绑定到类的类型名称的路径

请注意,TheData的ObjectInstance被设置为GroupSet的有效实例,该实例包含一些BasicGroups和AdvancedGroups的数组。

下面是相关的代码隐藏类:

public class Group 
{ 
    public string groupName; 

    public string df_groupName 
    { 
     get { return this.groupName; } 
     set { this.groupName = value; } 
    } 
} 

public class BasicGroup : Group 
{ 

} 

public class AdvancedGroup : Group 
{ 

} 

public class GroupSet 
{ 
    public Group [] groups; 

    public Group [] df_groups 
    { 
     get { return this.groups; } 
     set { this.groups = value; } 
    } 
}; 

这里的XAML:

<UserControl.Resources> 
    <ResourceDictionary> 
     <ObjectDataProvider x:Key="TheData" /> 

     <DataTemplate x:Key="GroupTemplate"> 
      <GroupBox Header="{Binding Path=DerivedTypeNameOf(group)}"> 
       <TextBox Text="This is some text"/> 
      </GroupBox> 
     </DataTemplate> 

    </ResourceDictionary> 
</UserControl.Resources> 

    <ItemsControl ItemsSource="{Binding Source={StaticResource TheData}, Path=groups}" ItemTemplate="{StaticResource GroupTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
    </ItemsControl> 
+0

你的问题是什么? – miguel 2011-05-15 16:34:45

回答

0

为什么不只是添加

public abstract string DerivedTypeName { get; set; } 

到你的基类,并覆盖它每个派生类型然后你只是绑定到一个字符串。

2

你总是可以使用ValueConverter要获得类型:

public class TypeNameConverter : IValueConverter { 
    public object Convert(object value, Type targetType, 
    object parameter, CultureInfo culture) { 
    return value.GetType().Name; 
    } 

    public object ConvertBack(object value, Type targetType, 
    object parameter, CultureInfo culture) { 
    throw NotImplementedException(); 
    } 
} 

这将让你有你的收藏在任何类型的,没有任何必要为它实现一个属性来获取价值。否则,就照大卫所说的那样去实施一个财产来给出结果。如果存在基类的通用继承,则甚至不需要在每个类中实现它。只需使用GetType()。名称实现它,并且您将始终获得正确的值。

相关问题