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

标签 c# wpf xml listview multiple-columns

我是 Binding 和 WPF 的新手,最近我学会了如何使用 Binding 技术创建一个包含多个列的 listBox

 <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);

每当我从 Gemployees 添加或删除项目时,ListView 都会执行刷新!!很酷,但在装订方面仍然有点辛苦。现在我正在为每个 ListView 做一个接口(interface)类,这样我就可以把我的东西放进去。它不会在添加项目时执行任何灵 active 。

最佳答案

您正在绑定(bind) ItemsSourceDataContext中的一个属性称为 Items ,所以要更新收藏,您需要转到 Items DataContext中的属性(property)并清除它。

此外,Items属性必须是 ObservableCollection 类型, 不是 List如果您希望它在基础集合发生变化时更新 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}" ... />

您正在绑定(bind) ItemsSourceObservableCollection<Student> ,当你想清除列表时,你可以调用:

Students.Clear()

关于c# - 在使用 ItemsSource 时操作无效。改为使用 ItemsControl.ItemsSource 访问和修改元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11089104/

相关文章:

.net - 如何将全局异常处理添加到加载项dll?

c# - 为什么我当前添加的列表框项目不可访问?

php - 如何使用 SimpleXML 解析 XML 的 CDATA HTML 内容?

已被覆盖的 C# FakeItEasy 假方法

c# - 如何对给定列和方向的 DataTable 进行排序?

c# - WinForm ListView 布局问题

xml - Golang 解析带有同名嵌套节点的 XML?

c# - 如何使用 C# 将 IUnknown 参数传递给 COM 接口(interface)?

c# - 绑定(bind)组合框到字典,下拉列表显示键和值

xml - 在项目方面更改版本时,Eclipse Mars 中具有 M2E 不稳定配置的动态 Web 模块