2013-03-11 118 views
4

我正在创建一个WPF应用程序,允许用户使用Entity Framework,CRUD操作和MVVM输入关于其员工的一些详细信息。我们有两个ListViews。其中一个包含员工名单(listview1),而另一个(listview2)列出他们的详细信息,如出生日期,地址等。下面的图片将为您提供我创建的更好的图片;在WPF中过滤ListView中的集合

ListView

我使用的是CollectionViewSoruce让我当你选择从ListBox1中一个特定的名称进行筛选上listview2结果。到目前为止,我能够实现这一点,但是当我添加一个员工或删除时,它会抛出一个异常;

An unhandled exception of type 'System.StackOverflowException' occurred in *.UI.exe 

这里是代码段,这可能有助于

视图模型:

private EmployeeListViewModel() 
     : base("") 
    { 
     EmployeeList = new ObservableCollection<EmployeeViewModel>(GetEmployees()); 
     this._employeeCol = new ListCollectionView(this.employeeList); 
    } 

    private ListCollectionView _employeeCol; 
    public ICollectionView EmployeeCollection 
    { 
     get { return this._employeeCol; } 
    } 

    private ObservableCollection<EmployeeViewModel> employeeList; 
    public ObservableCollection<EmployeeViewModel> EmployeeList 
    { 
     get { return employeeList; } 
     set 
     { 
      employeeList = value; 
      OnPropertyChanged("EmployeeList"); 
     } 
    } 

    private EmployeeViewModel selectedEmployee = null; 
    public EmployeeViewModel SelectedEmployee 
    { 
     get 
     { 
      return selectedEmployee; 
     } 
     set 
     { 
      selectedEmployee = value; 
      OnPropertyChanged("SelectedEmployee"); 
      EmployeeCollection.Filter = new Predicate<object>(o => SelectedEmployee != null && o != null && ((EmployeeViewModel)o).EmployeeID == SelectedEmployee.EmployeeID); 
     } 
    } 

    internal ObservableCollection<EmployeeViewModel> GetEmployees() 
    { 
     if (employeeList == null) 
      employeeList = new ObservableCollection<EmployeeViewModel>(); 
     employeeList.Clear(); 

     foreach (DataObjects.Employee i in new EmployeeRepository().GetAllEmployees()) 
     { 
      EmployeeViewModel c = new EmployeeViewModel(i); 
      employeeList.Add(c); 
     } 
     return employeeList; 
    } 

ListView2 - EmployeeListView;

  <ListView Name="lsvEmpoyeeList" Height="170" Width="700" 
        ScrollViewer.VerticalScrollBarVisibility="Visible" 
        ScrollViewer.HorizontalScrollBarVisibility="Visible" 
        HorizontalAlignment="Center" 
        IsSynchronizedWithCurrentItem="True" 
        ItemsSource="{Binding EmployeeCollection}" 
        SelectedItem="{Binding SelectedEmployee}"> 
        <ListView.View> 
         <GridView> 
         <GridViewColumn Header="Position" DisplayMemberBinding="{Binding Position}" Width="100" /> 
         <GridViewColumn Header="DateOfBirth" DisplayMemberBinding="{Binding DateOfBirth, StringFormat={}\{0:dd/MM/yyyy\}}" Width="100" /> 
        </GridView> 
        </ListView.View> 
       </ListView> 

ListView1 - EmployeeSetUpView;

  <ListView Height="380" HorizontalAlignment="Left" Name="lsNames" VerticalAlignment="Top" Width="170" 
      ScrollViewer.VerticalScrollBarVisibility="Visible" 
      ScrollViewer.HorizontalScrollBarVisibility="Visible" 
      SelectedItem="{Binding SelectedEmployee}" 
      ItemsSource="{Binding EmployeeList}" Grid.RowSpan="2" Grid.Row="1"> 

     <ListView.View> 
      <GridView> 
       <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding FirstName}" Width="80" /> 
       <GridViewColumn Header="Surname" DisplayMemberBinding="{Binding Surname}" Width="80" /> 
      </GridView> 
     </ListView.View> 
    </ListView> 
    <ContentControl Grid.Column="1" Grid.Row="1" HorizontalAlignment="Center" 
        Content="{Binding}" ContentTemplate="{StaticResource EmployeeListView}" /> 

正如您所见,我已将过滤器放在setaccessor之内。我把它放在构造函数中,但似乎发生的是没有任何细节出现在ListView2上。

此外,如果我从listview2而不是从listview1中选择一行,它也会产生StackOverFlowException,我不确定原因。

任何帮助将不胜感激或建议。另外,很抱歉的大问题!

+0

那么什么是你真正的问题,你得到一个StackOverflowException或者ListView2中没有列出详细信息? – Jehof 2013-03-11 09:46:41

+0

它似乎是两者的结合,并且特别是使用我理解的过滤器(并且很可能与绑定有关)。就像在问题中我说,如果我把过滤器放在构造函数中,它不会查询结果,也不会显示数据。而如果我在'setaccessor'内添加过滤器,它会产生异常。这就是为什么我问这个问题,知道如何改进我的应用程序。 – 2013-03-11 09:55:40

+0

“SelectedEmployee”的getter如何实现?你在那里有一个错字吗? – Jehof 2013-03-11 09:59:15

回答

3

我不认为UI知道EmployeeCollection已经改变

尝试在SelectedEmployee二传手添加PropertyChanged事件EmployeeCollection应用筛选后。

public EmployeeViewModel SelectedEmployee 
{ 
    get { return selectedEmployee;} 
    set 
    { 
     selectedEmployee = value; 
     OnPropertyChanged("SelectedEmployee"); 
     EmployeeCollection.Filter = new Predicate<object>(o => SelectedEmployee != null && o != null && ((EmployeeViewModel)o).EmployeeID == SelectedEmployee.EmployeeID); 

     // EmployeeCollection view has changed, Notify UI 
     OnPropertyChanged("EmployeeCollection"); 
    } 
} 

而且作为StackOverflowException我认为这是由以下事实引起了双方ListViewTwoWaySelectedEmployee结合,所以当一个ListView1的改变的SelectedItem它会导致ListView2更新其选定的项目,其更新ListView1的等等,等等。

尝试将结合单向的SelectedEmployee上ListView2

的SelectedItem = “{结合SelectedEmployee,模式=单向}”>

+0

@ sa_ddman213感谢您的回复。从你的答案,它的工作!干杯! :) – 2013-03-11 10:31:08