列表视图和列表框中的绑定对象/属性之间的差异

本文关键字:列表 属性 之间 绑定 视图 对象 | 更新日期: 2023-09-27 18:31:57

我有一个列表视图,它显示员工列表,每个 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,它在列表框中再次显示信息(只是一个简单的版本,它在列表框的每一行中显示几个字段)问题是当 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>

基本上在视图模型中,我有一个 linq 语句为:

PropertyEmployee = Employees.FirstOrDefault(item => item.EmployeeID == param.ToString());  

你能告诉我是什么导致了这个错误吗? 在列表视图中很好,但在列表框中我得到空对象。

列表视图和列表框中的绑定对象/属性之间的差异

我能够通过在我的视图中添加选定的属性来克服这个问题模型

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

希望这有帮助