Есть ли способ использовать DataTemplate для определения структуры объекта Border, созданного в коде? - PullRequest
0 голосов
/ 14 июля 2020

Итак, в настоящее время я пытаюсь научиться использовать привязки и DataContext, чтобы упростить структуру моего приложения.

У меня есть много динамически создаваемых элементов управления в моем приложении, которые я создаю во время выполнения в C#, например, эта простая рамка с текстовым полем внутри. Данные поступают из классов данных, которые я создал, в данном случае EntryData.

Класс данных

class EntryData : INotifyPropertyChanged
{
    public string EntryID { get; set; }
    public string Title { get; set; }
    public string ColourHex { get; set; }
}

Создание элемента управления и его размещение в сетке

Border outer_border = new Border();
outer_border.Tag = cur_entryData.EntryID;
outer_border.Background = GetSolidColorBrushFromHex(cur_entryData.ColourHex);
outer_border.Style = Application.Current.Resources["bor_EntryCalendarBlock"] as Style;

TextBlock txtblc_title = new TextBlock();
txtblc_title.Style = Application.Current.Resources["txtblc_CalendarBlockTitle"] as Style;
txtblc_title.Text = cur_entryData.Title;

//never got the binding to update

//txtblc_title.DataContext = cur_entryData;    
//Binding bind_title = new Binding();
//bind_title.Source = cur_entryData;
//bind_title.Mode = BindingMode.TwoWay;
//bind_title.Path = new PropertyPath("Title");
//bind_title.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;    
//txtblc_title.SetBinding(TextBlock.TextProperty, bind_title);

outer_border.Child = txtblc_title;

Grid.SetRow(outer_border, entry_row);
Grid.SetColumn(outer_border, entry_col);

my_grid.Children.Add(outer_border);

Вы можете видеть мою попытку использовать привязку к элементу управления, которая работала бы для его создания, но никогда не обновлялась бы при изменении EntryData, поэтому я отказался от этого. Скажем так, обновите заголовок I go до правильного индекса в my_grid.Children, извлеките границу, извлеките его дочерний текстовый блок, а затем измените свойство text на новое значение.

Это чертовски неуклюже чтобы создать и обновить все эти элементы управления, но я не знаю другого способа. Я немного читал об использовании datacontents для стилизации записей в кнопках и списках, но я хочу, чтобы Border (или технически Grid) был внешним слоем, поскольку это упрощает создание и изменение этого типа элементов управления.

Есть ли способ сделать что-то вроде этого

xaml

<Page.Resources>
    <DataTemplate x:Key="control_template_test" x:DataType="local:EntryData">
        <TextBlock Text="{x:Bind Title}"/>
    </DataTemplate>
</Page.Resources>

C#

Border new_border = new Border();

new_border.ContentTemplate = this.Resources["control_template_test"] as DataTemplate;
new_border.DataContext = cur_entryData;

Мне удалось заставить это работать с помощью кнопки, но не граница или сетка, я предполагаю, поскольку кнопка имеет свойство .Content. Также даже с помощью кнопки я не смог обновить текстовый блок при обновлении EntryData. Также я хочу добавить детали в саму границу, например, использовать тег для хранения entryID, для легкого доступа и цвет фона; Я не знаю, как это сделать с помощью DataTemplate.

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

EDIT:

Чтобы уточнить, я понимаю эту попытку использования ContentTemplate на границе скорее всего, не будет. Мне нужна помощь в достижении чего-то подобного с другим решением. Скажем, я создаю элемент управления-шаблон, который имеет рамку и текстовый блок, и когда я хочу, я могу просто создать его с привязкой данных к классу данных. В идеале эта привязка данных будет обновляться всякий раз, когда обновляется класс данных, но она просто не обновлялась, когда я пытался раньше.

...