2017-09-20 4 views
0

に動作し、私はだから私は記事を参照CollectionViewGroupカスタマイズCollectionViewGroupとされたListCollectionViewが、リストボックスに新しい項目を追加するとき、それは今

に新しいプロパティを追加したい: Custom CollectionViewType does not support multiple selection using shift key

クリックボタンを追加するとき新しいアイテム

collection add success(default count=9, add one, total count=10), 

ただし、listboxには新しいアイテムグループが表示されません。

多分実装するには不足しています。

私に助けてください、または私にキーワードを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]

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")); 
     } 
    } 

} 

答えて

0

あなたのコードは、クラスEmployeeCollectionViewのプロパティGroupsにListBoxのItemSourceをバインドされています、そのタイプはReadOnlyObservableCollection<object>ですそれは読み取り専用プロパティです。新しい従業員を追加すると、更新するようにUIに通知することはできません。変更は直接従業員にバインドItemSource

<ListBox Grid.Row="1" ItemsSource="{Binding Employees}" 
      ItemTemplate="{StaticResource EmployeeTemplate}" 
      SelectionMode="Extended"> 
     <ListBox.GroupStyle> 
      <x:Static Member="GroupStyle.Default"/> 
     </ListBox.GroupStyle> 
    </ListBox> 

: あなたはにあなたのListBoxタグを変更しようとすることができます。 あなたを助けることを願っています:)

+0

こんにちは@Renshaw、おかげでお返事が、私はCollectionViewType =割り当てる必要があります:私は、カスタマイズされたプロパティ(ブールIsDeleting)を追加する必要があるため、「ローカルEmployeeCollectionView」 を。 –

関連する問題