Как мне отобразить имя свойства в заголовке группы в wpf

#wpf #dataview #listcollectionview

#wpf #dataview #listcollectionview

Вопрос:

 <!-- GroupHeaderStyle -->
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander IsExpanded="False" Margin="15,0,0,0">
                    <Expander.Header>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding ????????????}"/>
                            <TextBlock Text="-->"/>
                            <TextBlock Text="{Binding Name}"/>
                        </StackPanel>
                    </Expander.Header>
                    <ItemsPresenter />
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  

В приведенном выше коде я хочу отобразить имя свойства, по которому оно сгруппировано.
Например, пол —> Мальчик; Пол -> Девочка.

 public class Test
{
    string gender;
    public string Gender
    {
        get { return gender; }
        set { gender = value; }
    } 
}
  

Что я должен предусмотреть???????????? в приведенном выше xaml?

Кроме того, пожалуйста, дайте мне знать, есть ли какая-нибудь хорошая книга или ссылка, в которой объясняются внутренние детали группировки ListCollectionView .

Ответ №1:

Это DataContext должен быть экземпляр CollectionViewGroup, Name для свойства которого будет установлено значение «группа» (т.Е. Значение Gender). Но нет никакой корреляции между CollectionViewGroup и тем, из какого свойства оно получено. Технически, свойство может иметь глубину в несколько уровней.

Единственная хорошая альтернатива — выполнить сортировку по другому свойству, в котором есть вся необходимая информация. CollectionViewGroup.Name Свойство является объектом, а не строкой. Итак, вы могли бы сделать что-то вроде:

 public class GenderGroup {

    public GenderGroup(string gender) {
        this.Gender = gender;
    }

    public string Gender { get; private set; }
    public string Title {
        get {
            return "Gender";
        }
    }

    public override bool Equals(object obj) {
        var other = obj as GenderGroup;
        return (other != null amp;amp; string.Equals(this.Gender, other.Gender));
    }
}

public class Test {
    string gender;
    GenderGroup genderGroup = new GenderGroup("none");

    public string Gender {
        get { return gender; }
        set {
            gender = value;
            genderGroup = new GenderGroup(gender);
        }
    } 

    public GenderGroup GenderGroup {
        get { return genderGroup; }
    }

}
  

А затем получить к нему доступ следующим образом:

 <!-- GroupHeaderStyle -->
<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander IsExpanded="False" Margin="15,0,0,0">
                    <Expander.Header>
                        <StackPanel Orientation="Horizontal">
                            <TextBlock Text="{Binding Name.Title}"/>
                            <TextBlock Text="-->"/>
                            <TextBlock Text="{Binding Name.Gender}"/>
                        </StackPanel>
                    </Expander.Header>
                    <ItemsPresenter />
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
  

Это основная идея, но вы могли бы сделать GenderGroup более общим. Таким образом, вместо жесткого кодирования "Gender" вы можете передать параметр, который имеет параметр.

Комментарии:

1. Спасибо CodeNaked за ответ… Означает ли это, что я не могу получить имя свойства, отображаемое в заголовке каким-либо прямым способом …?

2. @SudhakarSingh — я добавил к своему ответу единственное решение, которое я могу придумать.