Элементы списка XAML, привязываемые к действию - PullRequest
0 голосов
/ 18 января 2012

Я использую 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.Так как же я могу изменить элементы этого списка?

1 Ответ

1 голос
/ 18 января 2012

Хорошо, в вашем коде есть ошибки, которые могут вызвать проблему. В геттере, я думаю, у тебя должно быть это.

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++;
    }
}
...