一尘不染

使用ItemsSource时操作无效。改为使用ItemsControl.ItemsSource访问和修改元素

c#

我是Binding和WPF的新手,我已经学习了如何listBox使用Binding技术创建具有多列的

 <ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" >           
    <ListView.View>
            <GridView>
                <GridView.Columns>
                    <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" />
                    <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" />
                    <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" />
                    <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding Path=Notes}" />
                </GridView.Columns>
            </GridView>
        </ListView.View>
    </ListView>

这是代码:

List<Student> arr = search.students();
        listBoxSS.ItemsSource = arr;

但是问题是当我尝试使用添加或删除项目或清除时

 listBoxSS.Items.Clear();

请提供使用物品来源或添加,删除物品或清除列表的方式的示例。

编辑:

<ListView ItemsSource="{Binding Items}" Margin="306,70,22,17" MouseDoubleClick="listBoxSS_MouseDoubleClick" Name="listBoxSS" >
    <ListView.View>
        <GridView>
            <GridView.Columns>
                <GridViewColumn Header="first_name " Width="100" DisplayMemberBinding="{Binding Path=First_name}" />
                <GridViewColumn Header="last_name" Width="100" DisplayMemberBinding="{Binding Path=Last_name}" />
                <GridViewColumn Header="phone_number" Width="100" DisplayMemberBinding="{Binding Path=Phones[0]}" />
                <GridViewColumn Header="notes" Width="100" DisplayMemberBinding="{Binding Path=Notes}" />
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

这是代码:

 ObservableCollection<Employee> Gemployees;
var employees = new ObservableCollection<Employee>(search.employees());

search.employees() 获取我数据库中所有员工的列表

 listBoxPE.ItemsSource = employees;
        Gemployees = employees;

现在我可以对Gemployees执行所有方法

 Gemployees.Remove((Student)listBoxSS.SelectedItem);
 Gemployees.Add((Student)listBoxSS.SelectedItem);

ListView每当我添加或删除Gemployees的项目进行刷新!很酷,但在绑定方面仍然有些艰苦。现在,我正在为每个ListView做一个接口类,以便可以将其放入其中。它不会在添加项目中表现出任何灵活性。


阅读 1460

收藏
2020-05-19

共1个答案

一尘不染

你绑定ItemsSource在一个属性DataContextItems,所以要更新集合,你需要去Items的财产DataContext和清除。

另外,该Items属性的类型必须为ObservableCollectionList如果您希望在基础集合发生更改时更新UI ,则不需要。

ItemsSource不需要在后面的代码中设置代码的位,因此应将其删除。您只需要将其设置ItemsSource在一个位置,而不是两个都设置。

这是一个如何工作的简单示例:

// Using Students instead of Items for the PropertyName to clarify
public ObservableCollection<Student> Students { get; set; }

public MyConstructor()
{
    ...

    Students = search.students();
    listBoxSS.DataContext = this;
}

现在,当您拥有:

<ListView ItemsSource="{Binding Students}" ... />

您将绑定ItemsSourceObservableCollection<Student>,并且要清除列表时可以调用:

Students.Clear()
2020-05-19