Search code examples
c#wpfxamlbindingdatagrid

C#, WPF, bind List<string> to DataGrid


I have trouble to bind a List to a DataGrid. It should be as simple as possible. I'm new to WPF and this is for my personal education.

I have a View(Editor),ViewModel(VMText) and a Data(JustText) class.

My source so far:

JustText.cs

namespace Model
{
    public class Text
    {
        private string _code;
        public string Code
        {
            get { return _code;  }
            set { _code = value; }
        }

        public Text()
        {
            _code = "Hello World!\nHow you doin'?";
        }
    } 
}

VMText.cs

namespace ViewModel
{
    public class VMText
    {    
        private Model.Text _code;

        public List<string> Code
        {            
            get { return new List<string>(_code.Code.Split('\n'));        }
            set { _code.Code = System.String.Join("\n", value.ToArray()); }
        }

        private View.Editor editor;

        public VMText(View.Editor editor)
        {
            _code = new Model.Text();
            this.editor = editor; 
        }
    }
}

Editor.xaml

<Window x:Class="View.Editor"
        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"
        mc:Ignorable="d"
        Title="Editor" Height="240.024" Width="269.895">
    <Grid Background="#FF292929" Margin="0,0,-6.8,0.4">
        <DataGrid x:Name="dataGrid" 
                  HorizontalAlignment="Left" 
                  Margin="0,0,0,0" 
                  VerticalAlignment="Top"
                  Width="200pt"
                  Height="100pt"
                  DataContext="{Binding vmText}">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Code, UpdateSourceTrigger=PropertyChanged}" Foreground="Black" Width="60" Header="Test" IsReadOnly="false" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Editor.xaml.cs

namespace View
{
    public partial class Editor : Window
    {
        private ViewModel.VMText vmText;

        #region Constructor

        public Editor()
        {
            InitializeComponent();

            vmText = new ViewModel.VMText(this);
            DataContext = vmText;
        }

        #endregion
    }
}

I just want to show List which is created in VMText in one column in the DataGrid


Solution

  • I guess you simply want to display the strings in the Code source collection property of the view model in the DataGrid. You should

    • then bind the ItemsSource property of the DataGrid to the Code source property of the view model
    • and then bind the DataGridTextColumn to the strings in the Code list itself.

    You just have to modify the XAML markup of your view a bit to be able to see the strings. Try this:

    <DataGrid x:Name="dataGrid" 
            HorizontalAlignment="Left" 
            Margin="0,0,0,0" 
            VerticalAlignment="Top"
            Width="200pt"
            Height="100pt"
            ItemsSource="{Binding Code}"
            AutoGenerateColumns="False">
       <DataGrid.Columns>
       <DataGridTextColumn 
            Header="Test" IsReadOnly="false" 
            Binding="{Binding}" 
            Foreground="Black" 
            Width="60" />
       </DataGrid.Columns>
    </DataGrid>