작동합니까 그래서 나는 문서를 참조 새 항목사용자 정의 CollectionViewGroup 및 ListCollectionView를하지만, 목록 상자에 새 항목을 추가 할 때, 그것은 지금은 <code>CollectionViewGroup</code></p> <p>에 새 속성을 추가 할
collection add success(default count=9, add one, total count=10),
그러나 listbox
에는 새 항목 그룹이 표시되지 않습니다.
구현하기가 어떨까요?
Google에 알려 주시거나 Google에 키워드를 알려주십시오.
감사합니다.
[Window1.xaml]
<Window.Resources>
<CollectionViewSource x:Key="EmployeesSource" Source="{Binding Employees}" CollectionViewType="local:EmployeeCollectionView">
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="HireDate"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
<DataTemplate x:Key="EmployeeTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
</DataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Grid.Row="0">
<Button Name="addItem" Width="50" Height="50" Content="AddItem" HorizontalAlignment="Left" Click="addItem_Click"/>
</StackPanel>
<ListBox Grid.Row="1" ItemsSource="{Binding Source={StaticResource EmployeesSource}}"
ItemTemplate="{StaticResource EmployeeTemplate}"
SelectionMode="Extended">
<ListBox.GroupStyle>
<x:Static Member="GroupStyle.Default"/>
</ListBox.GroupStyle>
</ListBox>
</Grid>
[Window1.xaml.cs] 귀하의 코드는 클래스 EmployeeCollectionView
의 재산 Groups
에 목록 상자를 ItemSource를 바인더 제본 한
public partial class Window1 : Window
{
public ObservableCollection<Employee> Employees { get; set; }
public Window1()
{
InitializeComponent();
Employees = new ObservableCollection<Employee>
{
new Employee { FirstName = "FirstName1", LastName = "LastName1", HireDate = new DateTime(1970, 1, 1) },
new Employee { FirstName = "FirstName2", LastName = "LastName2", HireDate = new DateTime(1970, 1, 1) },
new Employee { FirstName = "FirstName3", LastName = "LastName3", HireDate = new DateTime(1980, 1, 1) },
new Employee { FirstName = "FirstName4", LastName = "LastName4", HireDate = new DateTime(1980, 1, 1) },
new Employee { FirstName = "FirstName5", LastName = "LastName5", HireDate = new DateTime(1980, 1, 1) },
new Employee { FirstName = "FirstName6", LastName = "LastName6", HireDate = new DateTime(1990, 1, 1) },
new Employee { FirstName = "FirstName7", LastName = "LastName7", HireDate = new DateTime(1990, 1, 1) },
new Employee { FirstName = "FirstName8", LastName = "LastName8", HireDate = new DateTime(1990, 1, 1) },
new Employee { FirstName = "FirstName9", LastName = "LastName9", HireDate = new DateTime(1990, 1, 1) },
};
DataContext = this;
}
private void addItem_Click(object sender, RoutedEventArgs e)
{
//Employees add suceess(total count=10), but ui does not add the item(1983,1,1)
Employees.Add(new Employee {
FirstName = "FirstName10",
LastName = "LastName10",
HireDate = new DateTime(1983, 1, 1)
});
}
}
class EmployeeCollectionView : ListCollectionView
{
private readonly IList<EmployeeCollectionViewGroup> _groups;
public override ReadOnlyObservableCollection<object> Groups
{
get { return new ReadOnlyObservableCollection<object>(new ObservableCollection<object>(_groups)); }
}
public EmployeeCollectionView(IList list)
: base(list)
{
_groups = list
.OfType<Employee>()
.GroupBy(x => x.HireDate)
.Select(x => new EmployeeCollectionViewGroup(x.Key, x))
.ToList();
}
}
class EmployeeCollectionViewGroup : CollectionViewGroup
{
public EmployeeCollectionViewGroup(object name, IEnumerable<object> protectedItems)
: base(name)
{
foreach (var protectedItem in protectedItems)
ProtectedItems.Add(protectedItem);
}
public override bool IsBottomLevel
{
get { return true; }
}
//i want to add a new property
public bool IsDeleting { get; set; }
}
public class Employee : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string m_FirstName;
public string FirstName
{
get { return m_FirstName; }
set
{
m_FirstName = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("FirstName"));
}
}
private string m_LastName;
public string LastName
{
get { return m_LastName; }
set
{
m_LastName = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("LastName"));
}
}
private DateTime m_HireDate;
public DateTime HireDate
{
get { return m_HireDate; }
set
{
m_HireDate = value;
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs("HireDate"));
}
}
}
안녕하세요 @Renshaw, 답장을 보내 주셔서 감사합니다. 그러나 사용자 지정 속성 (bool IsDeleting)을 추가해야하기 때문에 CollectionViewType = "local : EmployeeCollectionView" 을 할당해야합니다. –