WPF, привязывающий путь к типу имени класса - PullRequest
0 голосов
/ 15 мая 2011

Используя WPF, я хочу привязать заголовок GroupBox к typename полиморфного класса. Поэтому, если у меня есть класс с именем Element и два класса, производных от Element, такие как BasicElement и AdvancedElement, я хочу, чтобы заголовок GroupBox имел значение «BasicElement» или «AdvancedElement». Вот xaml, который я использую для GroupBox. Это часть DataTemplate, которая используется ItemsControl. Я надеюсь на что-то вместо Path = DerivedTypeNameOf (group) в XAML, где group - каждая группа в массиве groups.

Обратите внимание, что для ObjectInstance объекта TheData задан допустимый экземпляр GroupSet, который содержит массив некоторых BasicGroups и AdvancedGroups.

Вот соответствующие классы code-behind:

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>

Ответы [ 2 ]

2 голосов
/ 15 мая 2011

Вы всегда можете использовать 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 (). Name, и вы всегда получите правильное значение.

0 голосов
/ 15 мая 2011

Почему бы просто не добавить

public abstract string DerivedTypeName { get; set; }

к базовому классу и переопределите его для каждого производного типа, тогда вы просто привязываетесь к строке.

...