我正在使用Microsoft Activity Library Designer;由于某些原因,我需要使用ListBox来显示其中的一些信息。但我有一个问题是它的 ItemsSource binding.My活动侧属性是这样的:
private ObservableCollection<string> _selectedItems;
public ObservableCollection<string> SelectedItems
{
get
{
if (_selectedItems == null)
{
ObservableCollection<string> items = new ObservableCollection<string>();
return items;
}
return _selectedItems;
}
set
{
_selectedItems = value;
}
}
我的XAML端代码是这样的:
....
<Button Content="Add Item" HorizontalAlignment="Stretch" Grid.Column="0"
Click="Button_Click" Margin="5, 0, 5, 5"/>
<Button Content="Remove Item" HorizontalAlignment="Stretch" Grid.Column="1"
Click="DelButton_Click" Margin="5, 0, 5, 5"/>
....
<ListBox x:Name="LstSelectedPosts" MinHeight="20" ItemsSource="{Binding Path=ModelItem.Selecteditems, Mode=TwoWay}"/>
....
现在,当我尝试在 添加项目 和 删除项目中添加/删除此ListBox中的项目时strong>按钮单击事件,调试器显示一个错误,告诉我无法修改ListBox绑定源。 那么如何更改此列表框的项目?
答案 0 :(得分:1)
好的,您的代码中可能存在一些可能导致问题的错误。 在吸气器中,我认为你应该有这个。
if (_selectedItems == null)
{
_selectedItems = new ObservableCollection<string>();
}
return _selectedItems;
在您的版本中,_selectedItems永远不会被初始化。
在Xaml代码中,当您设置ItemSource时,您编写了Seleceteditems
而不是SelectedItems
此错误在编译时不会导致错误,但您的listBox没有将其itemSource设置为正确的元素。
然后,您没有在
中指定来源 ItemsSource="{Binding Path=ModelItem.Selecteditems, Mode=TwoWay}
这意味着默认情况下,源是对象的DataContext,而DataContext应该使用具有名为ModelItem
的公共属性的对象进行初始化,该公共属性又具有名为Selecteditems
的公共属性。
希望它有效。
这是一个小例子。 在我的xaml文件中
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox Height="287" HorizontalAlignment="Left" Margin="12,12,0,0" x:Name="LstSelectedPosts" VerticalAlignment="Top" Width="294"
ItemsSource="{Binding Path=SelectedItems, Mode=TwoWay}"/>
<Button Content="Add Item" HorizontalAlignment="Stretch" Click="Button_Click" Margin="321,110,68,170"/>
<Button Content="Remove Item" HorizontalAlignment="Stretch" Click="DelButton_Click" Margin="321,147,68,129"/>
</Grid>
在我的xaml.cs文件中
public partial class MainWindow : Window
{
private CDataContext _myCDataContext;
public MainWindow()
{
InitializeComponent();
_myCDataContext = new CDataContext();
DataContext = _myCDataContext;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
_myCDataContext.Add();
}
private void DelButton_Click(object sender, RoutedEventArgs e)
{
_myCDataContext.Remove(LstSelectedPosts.SelectedItem.ToString());
}
}
和我的CDataContext类
class CDataContext
{
private int _count = 0;
private ObservableCollection<string> _selectedItems;
public ObservableCollection<string> SelectedItems
{
get
{
if (_selectedItems == null)
{
_selectedItems = new ObservableCollection<string>();
}
return _selectedItems;
}
set
{
_selectedItems = value;
}
}
public void Remove(string s)
{
SelectedItems.Remove(s);
}
public void Add()
{
SelectedItems.Add(_count.ToString());
_count++;
}
}