0

I have this assignment where I'm supposed to make a List (it HAS to be a List and not an Observable Collection for some reason) that collects the variables from four textboxes into one class and displays them in a Listview after a button is clicked.

When you type in new variables in the textboxes and press the button again, the ListView is supposed to display them in a row under the previous one.

That's where my problem comes in. Whenever I click the button, it only displays one row, and it is always the last 4 variables I entered. I did all the data bindings and stuff you're supposed to do with WPF, but it's still not working. You can check out my code below.

ListView definition in XAML

<ListView Name="lv" Grid.Column="1" Grid.Row="1" Grid.RowSpan="3" ItemsSource="{Binding}">
        <ListView.View>
            <GridView>
                <GridViewColumn Header="Šifra" Width="35" DisplayMemberBinding="{Binding id}" />
                <GridViewColumn Header="Naziv" Width="70" DisplayMemberBinding="{Binding n}" />
                <GridViewColumn Header="Geo. širina" Width="67" DisplayMemberBinding="{Binding s}" />
                <GridViewColumn Header="Geo. dužina" Width="67" DisplayMemberBinding="{Binding d}" />
            </GridView>
        </ListView.View>
    </ListView>

Program that's executed when you click the button in XAML.CSe

private void Button_Click(object sender, RoutedEventArgs e)
    {
       
        bool x;
        string naz,temp=sifra.Text;
        int sif;
        List<Lokalitet> items = new List<Lokalitet>();
        float sir, duz;
        x = Int32.TryParse(temp,out sif);
        if(x==true)
        {
            temp = sirina.Text;
            temp = temp.Replace(',', '.');
            x = float.TryParse(temp, out sir);
            if(x==true)
                {
                temp = duzina.Text;
                temp = temp.Replace(',', '.');
                x = float.TryParse(temp, out duz);
                if (x == true)
                    {
                        naz = naziv.Text;
                        items.Add(new Lokalitet() { id = sif, s = sir, d = duz, n = naz });
                        lv.ItemsSource = items;
                }
                else MessageBox.Show("Nije unet realan broj geografske dužine");
                }
            else MessageBox.Show("Nije unet realan broj geografske širine");
        }
        else MessageBox.Show("Nije unet ceo broj koji označava šifru");

    }

Class Lokalitet definition

class Lokalitet
{
    public int id { get; set; }
    public  float s { get; set; }
    public float d { get; set; }
    public string n { get; set; }
}

I hope this is not written too messy, I hope it's not that big of a problem that all the variables and Alert messages are written in Serbian, it was a lot easier for me to know which is which that way.

1 Answer 1

1

First of all, you are recreating your items list every time the button is clicked - so it always have only one item. Move List<Lokalitet> items = new List<Lokalitet>(); to window class property.

public partial class MainWindow : Window
{

    public List<Lokalitet> LocItems { get; set; } = new List<Lokalitet>();
}

Also your ItemsSource is not updated because it checks that you are assigning the same collection. It will update if you will assign null before reassigning the collection:

lv.ItemsSource = null;
lv.ItemsSource = LocItems;

Also you don't need Binding in XAML if you are assigning ItemsSource property directly.

I strongly discourage you to use this double assignment hack because:

  1. It's wrong and hard to understand
  2. It may cause performance issues.

It's better to discuss and use ObservableCollection.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you so much, the double assignment works for this case because it's not a very complicated program, and it strictly said that I have to use a generic list instead of ObservableCollection , so I'll keep in mind what you said when doing more advanced projects, but for this one it worked like a charm!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.