列表框中的项目不规律地更新 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
属性.
我有一个简单的字符串列表,我想根据按下按钮时是否选中复选框来将其显示在列表框中。我的按钮侦听器中有这个逻辑:
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
属性.