【发布时间】:2013-03-11 09:15:48
【问题描述】:
我正在创建一个 WPF 应用程序,它允许用户使用 Entity Framework、CRUD 操作和 MVVM 输入有关其员工的一些详细信息。
到目前为止,我有两个ListViews。一个包含员工姓名列表 (listview1),而另一个 (listview2) 列出了他们的详细信息,例如出生日期、地址等。下面的图片可以让您更好地了解我正在创建的内容;
当您从 listbox1 中选择特定名称时,我正在使用 CollectionViewSoruce 来过滤 listview2 上的结果。到目前为止,我能够做到这一点,但是当我添加或删除员工时,它会引发异常;
An unhandled exception of type 'System.StackOverflowException' occurred in *.UI.exe
这里是可能有帮助的代码 sn-ps
视图模型:
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,我不确定这是为什么。
任何帮助或建议将不胜感激。另外,很抱歉这个大问题!
【问题讨论】:
-
现在你真正的问题是什么,你得到一个 StackOverflowException 或者 ListView2 中没有列出详细信息?
-
这似乎是两者的结合,特别是根据我的理解与过滤器有关(很可能与绑定有关)。就像我在问题中所说的那样,如果我将过滤器放在构造函数中,它不会查询结果并且不会出现数据。而如果我在
setaccessor中添加过滤器,则会产生异常。这就是为什么我问这个问题是为了了解如何改进我的应用程序。 -
SelectedEmployee的getter是如何实现的?你那里有错字吗? -
在我的代码 sn-p 中到底是怎样的。
标签: wpf entity-framework listview mvvm