列表框中的项目不规律地更新 WPF

Items in a listbox updating erratically WPF

我有一个简单的字符串列表,我想根据按下按钮时是否选中复选框来将其显示在列表框中。我的按钮侦听器中有这个逻辑:

private void fileSavePerms_Click(object sender, RoutedEventArgs e)
{
    foreach (CheckBox checkbox in checkboxList)
    {
        if (checkbox.IsChecked == true && !permissionList.Contains(checkbox.Name))
        {
            permissionList.Add(checkbox.Name);
        }

        else if (checkbox.IsChecked == false && permissionList.Contains(checkbox.Name))
        {
            permissionList.Remove(checkbox.Name);
        }
    }
    permListBox.ItemsSource = permissionList;
}

据我所知,这是您可以在单击按钮时执行非常简单的数据绑定的方法。然而,列表框第一次按预期更新,但随后会更新我试图填充该框的列表的不正确内容。我在输出中看不到任何可辨别的模式。

此外,一段时间后(点击几下按钮),我会捕捉到一个异常,说“an ItemsControl is inconsistent with its items source”。

我是否错误地设置了绑定或在错误的时间分配了 ItemsControl

更新:

列表框的XAML:

<ListBox x:Name="permListBox" ItemsSource="{Binding permissionList}" HorizontalAlignment="Left" Height="36" Margin="28,512,0,0" VerticalAlignment="Top" Width="442"/>

首先,您只能将属性绑定到控件。无法绑定字段。因此 permissionList 必须是您设置为 Window.DataContext 属性.

DataContext 对象的 属性

如果设置正确,那么您每次都可以创建一个新的 List<string>,然后将其分配给绑定到控件的 属性。您不必将其分配给 ItemsSource 属性 控件

假设您的 window 的数据上下文设置为 window 本身。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        this.DataContext = this;
    }

    public List<string> PermissionList
    {
        get { return (List<string>)GetValue(PermissionListProperty); }
        set { SetValue(PermissionListProperty, value); }
    }

    public static readonly DependencyProperty PermissionListProperty =
        DependencyProperty.Register(
            "PermissionList",
            typeof(List<string>),
            typeof(MainWindow),
            new PropertyMetadata(new List<string>())
        );

    private void fileSavePerms_Click(object sender, RoutedEventArgs e)
    {
        // You create a new instance of List<string>
        var newPermissionList = new List<string>();

        // your foreach statement that fills this newPermissionList
        // ...

        // At the end you simply replace the property value with this new list
        PermissionList = newPermissionList;
    }
}

在 XAML 文件中,您将拥有:

<ListBox 
    ItemsSource="{Binding PermissionList}"
    HorizontalAlignment="Left"
    VerticalAlignment="Top"
    Margin="28,512,0,0"
    Height="36"
    Width="442"/>

当然可以改进这个解决方案。

  • 您可以使用 System.Collections.ObjectModel.ObservableCollection<string> 类型,这样您就不必每次都创建 List<string> 的新实例,但您可以清除列表并在 [=19= 中添加新项目]声明。
  • 您可以使用具有此权限列表并实现 INotifyPropertyChanged 接口的 ViewModel class(例如 MainViewModel),然后设置此 [=39= 的实例] 到你的 WPF window 的 DataContext 属性.