#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 — я добавил к своему ответу единственное решение, которое я могу придумать.