2017-09-20 2 views
0

Ich möchte Referenz ich den Artikel so eine neue Eigenschaft CollectionViewGroupCustomized Collection und Listcollectionview, aber wenn ein neues Element zu Listbox hinzufügen, es funktioniert jetzt

hinzuzufügen: Custom CollectionViewType does not support multiple selection using shift key

wenn Klick-Taste hinzufügen neue Artikel

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

aber listbox zeigen nicht die neue Artikelgruppe.

vielleicht etwas fehlt zu implementieren.

bitte helfen Sie mir, oder geben Sie mir das Stichwort zu google.

Vielen Dank.

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

} 

Antwort

0

Ihr Code ListBox ItemSource auf Eigentum Groups die Klasse binded hat EmployeeCollectionView , die Art davon ist ReadOnlyObservableCollection<object> Es handelt sich um eine schreibgeschützte Eigenschaft. Wenn Sie einen neuen Mitarbeiter hinzufügen, kann die Benutzeroberfläche nicht mehr aktualisiert werden. Sie können versuchen, auf Ihre List-Box-Tag zu ändern:

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

Änderung ItemSource binden an Mitarbeiter direkt. Hoffe, dass Ihnen hilft :)

+0

Hallo @Renshaw, danke Ihre Antwort, aber ich muss zuweisen CollectionViewType = "local: EmployeeCollectionView" , weil ich eine benutzerdefinierte Eigenschaft (Bool IsDeleting) hinzufügen müssen. –

Verwandte Themen