¿Por qué el hecho de vincular el origen de datos de MainWindow en XAML no actúa de la misma manera que el vínculo en el enlace de código con this.datacontext = this?

Estoy tratando de usar el enlace de datos para enlazar una colección observable con la fuente de elementos de una cuadrícula de datos, a medida que obtengo información sobre WPF y demás.

En el código subyacente puedo establecer el DataContext conthis.DataContext = this; obloopDataGrid.DataContext = this;. Eso está bien y dandy.

Pensé que podría intentar algo como

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

en mi ventana principal, pero esto causa una excepción de desbordamiento de pila como se explica enesta pregunta. Bien, eso tiene algún sentido.

Despues de leeresta Y otras preguntas / respuestas que dicen probar.DataContext="{Binding RelativeSource={RelativeSource Self}}" en el código XAML de la ventana, pensé que podíaen realidad hacer esto. Aparentemente yono poder. O al menos, el IDE me permite y es sintácticamente correcto, pero no hace lo que quiero (es decir, exactamente quéthis.DataContext = this; hace).

Entonces leoesta acerca de usar"{Binding ElementName=, Path=}" Y traté de usarlo así:

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

Lo que tampoco funciona. Tal vez no por la misma razón, pero no puedo resolver el problema con eso.

Curiosamente, no puedo replicar el ejemplo de rebinding mostrado enPublicación del blog de Rachel Lim.

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>

DO#:

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; }
        }

    }
}

El código anterior es lo que estoy usando para probar esto, y actualmente está usando la versión de código subyacente que me da correctamente.

¿Qué estoy haciendo mal, lo que me impide obtener los mismos resultados que en la imagen anterior pero utilizando XAML para el manejo de DataContext? ¿No estoy conectando los puntos correctamente? ... me faltan algunos puntos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta