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

Yas*_*ser 21 c# xml wpf listview multiple-columns

我是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>
Run Code Online (Sandbox Code Playgroud)

这是代码:

List<Student> arr = search.students();
        listBoxSS.ItemsSource = arr;
Run Code Online (Sandbox Code Playgroud)

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

 listBoxSS.Items.Clear();
Run Code Online (Sandbox Code Playgroud)

我需要一个使用项目源的示例或我可以添加或删除项目或清除列表的方式.

编辑:

<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>
Run Code Online (Sandbox Code Playgroud)

这是代码:

 ObservableCollection<Employee> Gemployees;
var employees = new ObservableCollection<Employee>(search.employees());
Run Code Online (Sandbox Code Playgroud)

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

 listBoxPE.ItemsSource = employees;
        Gemployees = employees;
Run Code Online (Sandbox Code Playgroud)

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

 Gemployees.Remove((Student)listBoxSS.SelectedItem);
 Gemployees.Add((Student)listBoxSS.SelectedItem);
Run Code Online (Sandbox Code Playgroud)

ListView每当我添加或执行刷新从Gemployees删除一个项目!很酷,但仍然有点努力绑定.现在我正在为每个ListView做一个接口类,所以我可以把我的东西放进去.它在添加项目时不会有任何灵活性.

Rac*_*hel 28

您将绑定ItemsSource到被DataContext调用的属性Items,因此要更新集合,您需要转到该Items属性DataContext并清除它.

此外,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;
}
Run Code Online (Sandbox Code Playgroud)

现在,当你有:

<ListView ItemsSource="{Binding Students}" ... />
Run Code Online (Sandbox Code Playgroud)

你绑定ItemsSource到了ObservableCollection<Student>,当你想清除列表时,你可以调用:

Students.Clear()
Run Code Online (Sandbox Code Playgroud)


Bre*_*ett 14

奇怪但是真实:我的XAML文件中的以下错误击键产生了错误"当ItemsSource正在使用时操作无效.请改为使用ItemsControl.ItemsSource访问和修改元素.":

</ItemsControl.ItemTemplate>x`
Run Code Online (Sandbox Code Playgroud)

请注意关闭元素标记后面的"x`"字符.

  • 是的,奇怪但是真的:我写了以下内容:</ ItemControl.ItemTemplate >>(注意双关闭括号) (6认同)

小智 13

我知道这个问题已经在大约2年前得到了回答,但是我自己也遇到了这个问题并且想到了一个可行的解决方案,这个问题很有效.也许这在某些情况下不起作用,也许我只是没有看到一些东西,但它对我有用,所以我在这里分享它:

listView.ClearValue(ItemsControl.ItemsSourceProperty);
listView.ItemsSource = NewSource;
Run Code Online (Sandbox Code Playgroud)

我真诚地希望这有助于某人.


Tim*_*ter 8

我知道聚会晚了,但我认为上面的答案还不太清楚。它与流氓角色发布有关,但这也会导致异常:

<ItemsControl ItemsSource="{Binding AnObservableCollection}">
    <Label Content="{Binding Name}"/>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

当您的意思是:

<ItemsControl ItemsSource="{Binding AnObservableCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <Label Content="{Binding Name}"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

作为新来者(或在喝第一杯咖啡之前),很容易认为第一杯咖啡是正确的,而这种例外绝不能解释什么是错误的。