Search code examples
c#.netwpfdata-binding

Binding Dictionary Data to WPF Data Grid


I currently have a WPF that takes in a string, parses it and stores it in a dictionary where the key would be the column header, and value would be under it. Once the string is parsed a SECOND WPF Pop up opens with a Data Grid that should display this parsed message. I have looked through Stack Overflow to see others who have had this issue but none of their solutions have worked for mine.

MainWindow



public MainWindow()
        {
            
            InitializeComponent();
            DataContext = this;
        }

        
private void Button_Click(object sender, RoutedEventArgs e)
        {
            string input = HelloTextBox.Text;

            IMessage message = parseMessage(input);

            Type messageType = message.GetType();

            PropertyList proplist = GetPropertyList(messageType, message);

            // display message properties in popup window
            InfoDialog infoPopUp = new(proplist);
            infoPopUp.ShowDialog();

        }

Popup Window

public partial class InfoDialog : Window
{
    
    public PropertyList PropertyList { get; set; }
    public InfoDialog(PropertyList propList)
    {
        InitializeComponent();
        this.PropertyList = propList;
        
    }

XAML

<Grid>
    ItemsSource="{Binding PropertyList,
          RelativeSource={RelativeSource AncestorType=Window}}" AutoGenerateColumns="False" SelectionChanged="DataGridXAML_SelectionChanged">
        <DataGrid.Columns>
            <!-- Header Text and Bindings -->
            <DataGridTextColumn Header="Key" Binding="{Binding Key}" Width="*"/>
            <DataGridTextColumn Header="Value" Binding="{Binding Value}"  Width="*"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

Solution

  • You forgot to set the source object of the Binding:

    ItemsSource="{Binding PropertyList,
                  RelativeSource={RelativeSource AncestorType=Window}}"
    

    Alternatively, set

    DataContext = this;
    

    in the Window's constructor.