'adding a list to itemsource, WPF

I am starting with WPF and I have this problem. I have a file called MainWindow.xaml with this code:


<Window x:Class="View.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:View" xmlns:system="clr-namespace:System;assembly=System.Runtime"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid >
        <ItemsControl ItemsSource="{Binding}" x:Name="boardView">
        </ItemsControl>
    </Grid>
</Window>

And I have another file called MainWindow.xaml.cs with this code

namespace ViewModel
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var items = new List<string> { "a", "b", "c", "d", "e" };
           
        }
    }
}

Now I have to assign this list to boardView.ItemsSource. How can I do that?



Solution 1:[1]

You have four problems here that I can see that would need to get fixed for this to work.

  1. In order for data binding to work, you need to set the DataContext of your MainWindow.

MainWindow.xaml.cs:

    // Put this in the constructor after InitializeComponents();
    this.DataContext = this;
  1. Another requirement for data binding is to implement the INotifyPropertyChanged interface on the class you wish to having data binding (in your case this is MainWindow, but I recommend you read on MVVM design):

MainWindow.xaml.cs:

public partial class MainWindow : Window, INotifyPropertyChanged
  1. Data bindings only work on public properties, so using var items isn't following this requirement. Instead, make var items a public property that updates itself with the PropertyChanged event whenever the value changes.

MainWindow.xaml.cs:

    private List<string> items;
    public List<string> Items 
    { 
       get => this.items; 
       set 
       { 
           this.items = value; 
           PropertyChanged?.Invoke(this, new PropertyName(nameof(Items))); 
       }
    }
  1. Lastly, you need to fix your binding in the xaml to bind to your public property.

MainWindow.xaml:

<ItemsControl ItemsSource="{Binding Items}" x:Name="boardView">

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Tam Bui