我有一个简单的字符串列表,我想在列表框中显示,具体取决于按下按钮时是否选中了复选框。我的按钮监听器中有这个逻辑:
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"/>
答案 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
语句中添加新项目MainViewModel
)并实现INotifyPropertyChanged
接口,然后将此类的实例设置为WPF窗口{{ {1}} property。