Dlaczego powiązanie kontekstu danych MainWindow w XAML nie działa tak samo jak powiązanie w łańcuchu kodu z tym.datacontext = this?

Próbuję użyć powiązania danych, aby powiązać ObservableCollection z ItemSource DataGrid, ponieważ uczę się o WPF i innych.

W kodowaniu mogę ustawić DataContext za pomocąthis.DataContext = this; lubbloopDataGrid.DataContext = this;. To dobrze i elegancko.

Myślałem, że mogę spróbować czegoś takiego

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

w moim głównym oknie, ale powoduje to wyjątek przepełnienia stosu, jak wyjaśniono wto pytanie. Dobrze, to ma jakiś sens.

Po przeczytaniuto i inne pytania / odpowiedzi, które mówią, aby spróbowaćDataContext="{Binding RelativeSource={RelativeSource Self}}" w kodzie XAML okna myślałem, że mogęfaktycznie to zrobić. Najwyraźniej janie może. A przynajmniej IDE pozwala mi i jest poprawne składniowo, ale nie robi tego, co chcę (tj. Dokładnie, cothis.DataContext = this; robi).

Potem czytamto o używaniu"{Binding ElementName=, Path=}" i próbowałem go używać tak:

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

Który również nie działa. Może nie z tego samego powodu, ale nie mogę rozwiązać problemu.

Co dziwne, nie mogę powtórzyć przykładu ponownego wiązania pokazanego wPost na blogu 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; }
        }

    }
}

Powyższy kod jest tym, czego używam do testowania tego i obecnie używa wersji kodu, która poprawnie mnie podaje

Co robię źle, co uniemożliwia mi uzyskanie tych samych wyników, co powyższe zdjęcie, ale użycie XAML do obsługi DataContext? Czy właściwie nie łączę kropek? ... brakuje mi kropek?

questionAnswers(1)

yourAnswerToTheQuestion