WPF Databinding: Как перевести привязку в XAML в привязку в коде и наоборот? - PullRequest
0 голосов
/ 03 декабря 2018

В данный момент я пытаюсь понять привязку данных WPF.И мой подход заключается в том, чтобы выяснить, как перевести многочисленные примеры реализаций связывания в коде XAML один в один в код позади.

Вот первый пример, с которым у меня возникли проблемы.Я был бы рад, если бы вы могли мне помочь:

У меня есть небольшой пример программы, которая должна сделать следующее.

У меня есть три объекта пользовательского типа данных «DataObjects» с тремя свойствами («Property1, Property2, Property3), которые хранятся в списке« myList ». Здесь вы видите код класса« DataObjects »:

namespace BindingExperiment
{
  public class DataObjects
  {
    public string Property1 { get; set; }

    public string Property2 { get; set; }

    public string Property3 { get; set; }

    public DataObjects(string p1, string p2, string p3)
    {
      Property1 = p1;
      Property2 = p2;
      Property3 = p3;
    }
  }
}

После создания трех объектов класса «DataObjects» эти три объекта сохраняются в списке под названием «myList»:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace BindingExperiment
{
  public partial class MainWindow : Window
  {
    private List<DataObjects> myList;

    public MainWindow()
    {
      InitializeComponent();

      DataObjects ds1 = new DataObjects("Hans", "Muller", "Fahrrad");
      DataObjects ds2 = new DataObjects("Volker", "Schmidt", "Auto");
      DataObjects ds3 = new DataObjects("Peter", "Siebert", "Boot");

      myList = new List<DataObjects>();
      myList.Add(ds1);
      myList.Add(ds2);
      myList.Add(ds3);

    }
  }
}

В моем окне графического интерфейса естьDataGrid, в котором я хочу отобразить мои три «объекта DataObjects», которые хранятся в «myList». Код XAML без каких-либо привязок выглядит в этот момент так:

<Window x:Class="BindingExperiment.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingExperiment"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
  <Window.Resources>
  </Window.Resources>
  <Grid>
    <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="71,29,0,0" VerticalAlignment="Top" Height="245" Width="370">

    </DataGrid>

  </Grid>
</Window>

Теперь я хотел попробоватьпервая реализация привязки из таблицы данных к «myList» в коде позади. Я создал экземпляр объекта привязки «myBinding» с привязкой «myList», определенной в свойстве Source «myBinding». Затем я связал свойство ItemsSource моей DataGridв bindingsource "myList", установив "myBinding" для ItemsSource. Я попробовал это:

Binding myBinding = new Binding();
myBinding.Source = myList;
BindingOperations.SetBinding(dataGrid, DataGrid.ItemsSourceProperty, myBinding);

Итак, мой код в MainWindoКласс w теперь выглядит следующим образом:

using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;

namespace BindingExperiment
{

  public partial class MainWindow : Window
  {
    private List<DataObjects> myList;

    public MainWindow()
    {
      InitializeComponent();

      DataObjects ds1 = new DataObjects("Hans", "Muller", "Fahrrad");
      DataObjects ds2 = new DataObjects("Volker", "Schmidt", "Auto");
      DataObjects ds3 = new DataObjects("Peter", "Siebert", "Boot");

      myList = new List<DataObjects>();
      myList.Add(ds1);
      myList.Add(ds2);
      myList.Add(ds3);

      **Binding myBinding = new Binding();
      myBinding.Source = myList;
      BindingOperations.SetBinding(dataGrid, DataGrid.ItemsSourceProperty, myBinding);**
    }
  }
}

Это работает!

Теперь я хотел сделать то же самое в коде XAML.Я попытался связать атрибут ItemsSource элемента DataGrid с помощью расширения разметки.Я попробовал это:

<DataGrid x:Name="dataGrid" ... ItemsSource="{Binding Source=myList}">

Насколько я понимаю, расширение разметки будет работать так: создание объекта привязки осуществляется с помощью конструктора по умолчанию класса привязки (поскольку токен "Source = myList" содержитзнак равенства).После этого для свойства Source объекта привязки устанавливается значение «myList».

Затем этот объект привязки передается свойству ItemsSource DataGrid.

Я думал, что это будет точно так же, как раньше, когда я пытался реализовать привязку в коде.Но это не работает.

Мой код XAML теперь выглядит следующим образом (Примечание: мой класс MainWindow теперь снова выглядит как в начале без создания объекта привязки):

<Window x:Class="BindingExperiment.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindingExperiment"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">   <Window.Resources>   </Window.Resources>   <Grid>
    <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Margin="71,29,0,0" VerticalAlignment="Top" Height="245" Width="370" ItemsSource="{Binding Source=myList}">

    </DataGrid>

  </Grid> </Window>

Чтоя скучал здесь?Где мое недоразумение?

...