我有一个ListView,它显示了员工列表,每个SelectionChanged事件都显示了一组文本框中每个员工的不同信息。
<ListView ItemsSource="{Binding Employees}" x:Name="lvEmployeeList" Grid.Row="1" Grid.Column="1" Width="385" SelectedIndex="0" Margin="1,1,1,1" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ProcessCommand}" CommandParameter="{Binding ElementName=lvEmployeeList, Path=SelectedItem.EmployeeID}" ></i:InvokeCommandAction>
</i:EventTrigger>
</i:Interaction.Triggers>
哪个工作正常。然后我想了解DataTemplate所以这次我使用了ListBox,它再次在Listbox中显示信息(只是一个简单的版本,它在列表框的每一行显示很少的字段)问题是当SelectionChanged发生时,我得到一个运行时错误
对象引用未设置为对象的实例。
<ListBox x:Name="lstEmployees" ItemsSource="{Binding Employees}" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding EmployeeID}" />
<TextBlock Text="{Binding BackgroundID}" />
<TextBlock Text="{Binding EmployeeName}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding ProcessCommand}" CommandParameter="{Binding ElementName=lstEmployee, Path=SelectedItem.EmployeeID}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</ListBox>
基本上在ViewModel中我有一个linq语句:
PropertyEmployee = Employees.FirstOrDefault(item => item.EmployeeID == param.ToString());
你能告诉我导致这个错误的原因是什么吗?在ListView中它很好,但在ListBox中我得到了null对象。
答案 0 :(得分:0)
我能够通过在viewModel
中添加所选属性来克服此问题public Employee SelectedEmployee { get; set; }
然后以OneWayToSource
模式
<ListBox x:Name="lstEmployees" ItemsSource="{Binding Employees}" SelectionMode="Single" SelectedItem="{Binding Path=SelectedEmployee, Mode=OneWayToSource}">
让ProcessCommand
不参数
<i:InvokeCommandAction Command="{Binding ProcessCommand}"/>
最后,在ProcessCommand
执行内部,检索您的Employee
ID并从那里做任何事情......
var id = SelectedEmployee.EmployeeId;
// Do whatever you want
希望这有帮助