Question

Is there a way to link two items in a ListBox together? What I'm trying to accomplish is allowing a user to delete an item in a ListBox and before that item is removed it either removes the item that is one above it if it's even or one below if it's odd. Or is there something else I should be using instead of a ListBox? Here is the part of my code that handles the removal:

private void DeleteItem(string path)
{
    var index = FileList.IndexOf(path);
    if (index % 2 == 0)
    {
        FilesList.RemoveAt(index + 1);
    }
    else
    {
        FileList.RemoveAt(index - 1);
    }
    FileList.Remove(path);        
}
Was it helpful?

Solution

Do you really need to link two different items or is it just that you need the visual appearance of two items (one above the other) for each object in the list? If the later is the case then you could define a view model and specify an item template in XAML. Then for collection changed logic, you could use ObservableCollection which implements INotifyCollectionChanged and raises a CollectionChanged event.

public partial class MainWindow : Window
{
    class ListItemViewModel
    {
        public string Name1 { get; set; }
        public string Name2 { get; set; }
    }

    ObservableCollection<ListItemViewModel> items;

    public MainWindow()
    {
        InitializeComponent();

        // Populate list...
        // In reality, populate each instance based on your related item(s) from your data model.
        items = new ObservableCollection<ListItemViewModel>
        {
            new ListItemViewModel { Name1 = "Foo1", Name2 = "Foo2" },
            new ListItemViewModel { Name1 = "Bar1", Name2 = "Bar2" }
        };

        listBox1.ItemsSource = items;
        items.CollectionChanged += items_CollectionChanged;
    }

    void items_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
    {
        switch (e.Action)
        {
            case NotifyCollectionChangedAction.Remove:
                for (int i = 0; i < e.OldItems.Count; i++)
                {
                    var itemVm = e.OldItems[i] as ListItemViewModel;

                    // Update underlying model collection(s).
                }
                break;

            //  Handle cases Add and/or Replace...
        }
    }
}

XAML:

<ListBox x:Name="listBox1">
    <ListBox.ItemTemplate>
        <ItemContainerTemplate>
            <StackPanel>
                <TextBlock Text="{Binding Name1}" />
                <TextBlock Text="{Binding Name2}" />
            </StackPanel>
        </ItemContainerTemplate>
    </ListBox.ItemTemplate>
</ListBox>
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top