C# wpf bindowanie ListView

0

Witam, jestem początkującym "programistą" C# i napotkałem na pewien problem jeśli chodzi o bindowanie ListView. Chciałbym uzyskać następujący efekt. Po kliknięciu buttona Load otwiera mi się okno dialogowe, z którego mogę sobie wybrac piosenki, których tytuły zapiszą się w liście. ListVeiw jest bindowany do tej listy więc sądziłem, że po załadowaniu tych tytułów do listy automatycznie pojawią się one w ListVeiw lecz jednak tak sie nie dzieje. Tutaj mój kod:

Tutaj fragmenty kody xaml:
<ListView x:Name="FilesInPlayList" ItemsSource="{Binding listOfLoadedFiles, UpdateSourceTrigger=PropertyChanged}" BorderThickness="0" >

<Button x:Name="Load" Height="25" Content="Load" Command="{Binding LoadFilesCommand, Mode=TwoWay}" />

` class ViewModel : BindableBase
{

    public ICommand LoadFilesCommand { get; set; }

    public List<string> _listOfLoadedFiles;
    public List<string> listOfLoadedFiles
    {
        get
        {
            return _listOfLoadedFiles;
        }
        private set
        {
            _listOfLoadedFiles = value;
            RaisePropertyChanged("listOfLoadedFiles");
        }
    }

    public ViewModel()
    {
        LoadFilesCommand = new DelegateCommand(LoadFilesAction);
    }


    private void LoadFilesAction()
    {
        OpenFileDialog openFileDialog = new OpenFileDialog();
        openFileDialog.Multiselect = true;

        listOfLoadedFiles = new List<string>();

        if (openFileDialog.ShowDialog() == true)
        {


            foreach (string filename in openFileDialog.FileNames)
            {
                //dodaje do listy tylko nazwy plikow
                listOfLoadedFiles.Add(System.IO.Path.GetFileName(filename));
            }
        }
    }
}`

i klasa main

`public partial class MainWindow : Window
{

    public MainWindow()
    {
        InitializeComponent();
        ViewModel vModel = new ViewModel();
        Load.DataContext = vModel;
        FilesInPlayList.DataContext = vModel;
    }


}`

Chciałem dodać jeszcze, że gdy zamieniłem tą listę listOfLoadedFiles na zmienną string to działało(oczywiście pobierało tylko jeden tytuł).
Gdy robiłem cos takiego listOfLoadedFiles.Add("cos"); w metodzie LoadFilesAction() ale przed tym ifem to dziala, dodaje prawidłowo i aktualizuje się też ListView

z góry dziękuje za pomoc.

2

Masz dwa wyjsćia:

  1. Użyj ObservableCollection<string> zamiast tej swojej listy
  2. Obecnie przypisujesz pustą listę do tego swojego propertisa (listOfLoadedFiles) i wtedy jest wywoływane RaisePropertyChanged
    zamiast tego pierw stwórz sobie jakaś tymczasową listę, załaduj do niej dane, i dopiero wtedy przypisz ją do tego swojego propertisa (listOfLoadedFiles)

PS: w C# propertisy się z dużej litery pisze

0

Dzięki wielkie użyłem pierwszego sposobu i działa :) Dzięki jeszcze raz bo męczyłem się z tym długi czas. A tak przy okazji to co robie w tej klasie main czyli nazywanie komponentow w xamlu i następnie w MainWindow przypisywaniue im(odwolujac sie do ich nazwy) odpowiednie datacontex jest prawidlowe ? Bo wydaje mi sie, że to łamie zasady wzorca MVVM

0

No nie jest to standardowe rozwiązanie że przypisujesz ten sam viewmodel do dwóch różnych nazwanych kontrolek w widoku(oknie), zwykle przypisuje się view model do całego widoku/okienka (this.DataContext = vModel;). Ogólnie jest wiele różnych sposób na ustawienie datacontextu i trzeba sobie wybrać ten który nam pasuje najbardziej, ja lubię podejście w którym viewmodel i widok są tworzone oddzielnie przez jakąś infrastrukturę, a potem ta infrastruktura spina je ze sobą. No ale na początek to co robisz też jak najbardziej jest w zgodzie z MVVM.

1 użytkowników online, w tym zalogowanych: 0, gości: 1