2012-01-18 2 views
0

Я использую Microsoft Activity Library Designer; По некоторым причинам мне нужно использовать ListBox, чтобы показать некоторую информацию в it.But У меня есть проблема с его ItemsSource binding.My активность свойство на стороне, как это:XAML Элементы ListBox, привязанные к активности

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 в Добавить Item и Remove Item кнопки click event, отладчик показывает мне ошибку, которая говорит, что я не могу изменить источник привязки ListBox. Итак, как я могу изменить Элементы Listbox?

ответ

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++; 
    } 
} 
Смежные вопросы