Search code examples
c#wpflistboxcode-behind

Listbox Not Tracking User Input


I've got a ListBox that is displaying a dynamic number of TextBoxes. The user will enter text into these boxes. When the Submit button is clicked, I need to be able to access the text the user has input, should be at ListBox.Items, like so:

    //Called on Submit button click
    private void SaveAndSubmit(object sender, ExecutedRoutedEventArgs e)
    {
        var bounds = MyListBox.Items;
    }

But MyListBox.Items doesn't change after I initially set the ItemsSource, here:

    //Field declaration
    //Bounds is containing a group of strings that represent the boundaries
    //for a contour plot. The min/max values are stored at the front and back
    //of the group. However, there can be any number of dividers in between.
    public ObservableCollection<string> Bounds { get; set; }

    ...
    //Initialize Bounds in the constructor

    //Called when the selected item for DVList (an unrelated ListBox) is changed
    private void DVSelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var selectedDV = DVList.SelectedItem as DVWrapper;
        if (selectedDV != null)
        {
            //Setting min/max
            Bounds[0] = selectedDV.MinValue;
            Bounds[Bounds.Count - 1] = selectedDV.MaxValue;

            MyListBox.ItemsSource = Bounds;
        }
    }

My XAML looks like this:

<Window.Resources>
    <Style x:Key="BoundsStyle" TargetType="{x:Type ListBoxItem}">
        <Setter Property="ContentTemplate">
            <Setter.Value>
                <DataTemplate>
                    <Grid>
                        ...
                        <TextBox/>
                    </Grid>
                </DataTemplate>
            </Setter.Value>
        </Setter>
        <Setter Property="Focusable" Value="False"/>
    </Style>
</Window.Resources>

...

                <ListBox Name="MyListBox"
                         ItemContainerStyle="{StaticResource BoundsStyle}"/>

So when SaveAndSubmit is called, bounds ends up being what I had originally set it to in DVSelectionChanged. In other words, the listbox is not updating based on what the user has input into the textboxes contained in listbox. How can I get the updated ListBoxItems? I think my problem is similar to this one, but it's not working for me at the moment.

When I step through in the debugger, I can get individual ListBoxItems. However, their Content is empty. I'm looking into that right now.


Solution

  • You need to bind content of the textbox.

    <TextBox/> need to change to <TextBox Content="{Binding}"/>

    But follow MVVM else it will be difficult to find these errors.