绑定到Activity的XAML ListBox项

时间:2012-01-18 08:44:10

标签: xaml binding listboxitem workflow-activity

我正在使用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绑定源。 那么如何更改此列表框的项目?

1 个答案:

答案 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++;
    }
}