列表框中的项目不正确地更新WPF

时间:2017-02-18 16:34:35

标签: c# wpf data-binding listbox itemssource

我有一个简单的字符串列表,我想在列表框中显示,具体取决于按下按钮时是否选中了复选框。我的按钮监听器中有这个逻辑:

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"/>

1 个答案:

答案 0 :(得分:2)

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

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

我们假设您的窗口数据上下文已设置为窗口本身。

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>的新实例,但您可以清除列表并在foreach语句中添加新项目
  • 您可以使用具有此权限列表的ViewModel类(例如MainViewModel)并实现INotifyPropertyChanged接口,然后将此类的实例设置为WPF窗口{{ {1}} property。