Warum funktioniert das Binden des MainWindow-Datenkontexts in XAML nicht wie das Binden im Codebehind mit this.datacontext = this?

Ich versuche, mithilfe der Datenbindung eine ObservableCollection an die ItemsSource eines DataGrid zu binden, während ich etwas über WPF und andere Dinge erfahre.

Im Code-Behind kann ich den DataContext mit setzenthis.DataContext = this; oderbloopDataGrid.DataContext = this;. Das ist in Ordnung und gut so.

Ich dachte, ich könnte so etwas versuchen

<Window.DataContext>
    <local:MainWindow/>
</Window.DataContext>

in meinem Hauptfenster, aber dies führt zu einer Stapelüberlauf-Ausnahme, wie in erläutertdiese Frage. Gut, das macht Sinn.

Nach dem Lesendiese und andere Fragen / Antworten, die sagen, zu versuchenDataContext="{Binding RelativeSource={RelativeSource Self}}" Im XAML-Code des Fensters dachte ich, ich könntemach das eigentlich. Anscheinend ichkann nicht. Oder zumindest lässt die IDE mich und es ist syntaktisch korrekt, tut aber nicht, was ich will (dh genau wasthis.DataContext = this; tut).

Dann habe ich gelesendiese über die Verwendung"{Binding ElementName=, Path=}" und versuchte es so zu benutzen:

<DataGrid
    Name="bloopDataGrid"
    Grid.Row="1"
    ItemsSource="{Binding ElementName=testWin, Path=OutputCollection}">
</DataGrid>

Was auch nicht funktioniert. Vielleicht nicht aus dem gleichen Grund, aber ich kann das Problem damit nicht herausfinden.

Seltsamerweise kann ich das in gezeigte Rebinding-Beispiel nicht replizierenRachel Lims Blogbeitrag.

XAML:

<Window
    x:Class="DataBinding.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow"
    Height="350"
    Width="525"
    x:Name="testWin">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition />
        </Grid.RowDefinitions>

        <Label Grid.Row="0" Content="{Binding text}">   
        </Label>

        <DataGrid
            Name="bloopDataGrid"
            Grid.Row="1"
            ItemsSource="{Binding Path=OutputCollection}">
        </DataGrid>
    </Grid>
</Window>

C #:

using System;
using System.Collections.ObjectModel; //For ObservableCollection<T>
using System.Windows;

namespace DataBinding
{
    public partial class MainWindow : Window
    {
        public String text { get; set; }
        public ObservableCollection<testStruct> OutputCollection { get; set; }

        public struct testStruct
        {
            public testStruct(String x, String y) : this()
            {
                Col1 = x;
                Col2 = y;
            }
            public String Col1 { get; set; }
            public String Col2 { get; set; }
        }

        public MainWindow()
        {
            InitializeComponent();

            testA t1 = new testA();
            this.DataContext = this;
            //this.DataContext = t1;
            //bloopDataGrid.DataContext = this;
            text = "bound \"this\"";
            t1.text = "bound a class";

            OutputCollection = new ObservableCollection<testStruct>();
            OutputCollection.Add(new testStruct("1", "2"));
            OutputCollection.Add(new testStruct("3", "4"));
        }

        public class testA
        {
            public String text { get; set; }
        }

    }
}

Den obigen Code verwende ich, um dies zu testen, und verwende derzeit die Code-Behind-Version, die mir korrekt angezeigt wird

Was mache ich falsch, wodurch ich nicht die gleichen Ergebnisse wie im obigen Bild erhalte, sondern XAML für die DataContext-Verarbeitung verwende? Verbinde ich die Punkte nicht richtig? ... fehlen mir Punkte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage