Я пытаюсь использовать привязку данных для привязки ObservableCollection к ItemsSource DataGrid, так как я узнаю о WPF и т.д.
В кодировке я могу установить DataContext с this.DataContext = this;
или bloopDataGrid.DataContext = this;
. Это прекрасный и денди.
Я думал, что могу попробовать что-то вроде
<Window.DataContext>
<local:MainWindow/>
</Window.DataContext>
в моем главном окне, но это вызывает исключение, как описано в этом вопросе. Хорошо, это имеет смысл.
После прочтения этого и других вопросов/ответов, которые говорят попробовать DataContext="{Binding RelativeSource={RelativeSource Self}}"
в окне XAML-кода, я думал, что смогу это сделать. По-видимому, я не могу. Или, по крайней мере, IDE позволяет мне и синтаксически корректировать, но не делает то, что я хочу (т.е. Именно то, что делает this.DataContext = this;
).
Затем я прочитал об использовании "{Binding ElementName=, Path=}"
и попытался использовать его так:
<DataGrid
Name="bloopDataGrid"
Grid.Row="1"
ItemsSource="{Binding ElementName=testWin, Path=OutputCollection}">
</DataGrid>
Что тоже не работает. Возможно, не по той же причине, но я не могу понять проблему с этим.
Как ни странно, я не могу воспроизвести пример перезаписи, показанный в Rachel Lim blog post.
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>
С#
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; }
}
}
}
Вышеприведенный код - это то, что я использую для проверки этого, и в настоящее время использует версию кода, которая правильно дает мне
Что я делаю неправильно, что мешает мне получать те же результаты, что и выше, но с помощью XAML для обработки DataContext? Не подключаю ли я точки правильно?... я пропущу несколько точек?