Переменная Binding-Path - PullRequest
       1

Переменная Binding-Path

0 голосов
/ 25 ноября 2011

Мне нужно отобразить дамп памяти для технического приложения.Каждый байт (ячейка) должен быть определен с помощью DataTemplate для отображения дополнительной информации (выделите, установив цвет фона, отдельную подсказку и т. Д.).Я предпринял следующую попытку:

  <DataTemplate x:Key="HexNumberTemplate">
    <Grid>
      [...]
      <TextBlock>
        <TextBlock.Text>
          <Binding Path="Cell[0].Value">
            <Binding.Converter>
              [...]
            </Binding.Converter>
          </Binding>
        </TextBlock.Text>
      </TextBlock>
    </Grid>
  </DataTemplate>

Окончательный результат должен выглядеть следующим образом:
Dump example

Моя проблема - это путь привязки с фиксированным кодом.«Ячейка» - это список объектов, который содержит всю необходимую информацию для отображения ячейки.Используя этот подход, мне нужно 16 раз определить один и тот же DataTemplate с Cell [0] до Cell [15].Я определенно хочу этого избежать!
Я прочитал подход, определяющий DataTemplate в исходном коде, где я собираю XAML в строку и вызываю Markup.XamlReader.Load ( MemoryStreamOfTheString ).Но здесь я теряю комфорт Visual Studio IDE.
Можно ли определить DataTemplate в XAML и сделать индексатор Cell-Object параметром?

Ответы [ 4 ]

2 голосов
/ 25 ноября 2011

Вы должны делать то, что прочитали: динамически создавать шаблоны, загружая их с помощью XamlReader. Для удобства работы с редактором XAML вы можете определить свой шаблон в отдельном файле xaml следующим образом:

<DataTemplate
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid DataContext="{Binding Current_Cell}">
        <!--Your template controls goes here.-->
    </Grid>
</DataTemplate>

Затем задайте тип этого файла как Resource, загрузите его в строку и просто замените Current_Cell каждым отдельным номером ячейки, прежде чем загружать шаблон из строки при создании представления. Установив DataContext of Grid, вы помогаете себе использовать другую привязку внутри шаблона (контекст уже установлен для текущей ячейки, и вам не нужно заменять ее везде).

Я недавно был в такой же ситуации, единственное отличие было в том, что в моей сетке были полностью динамические столбцы (загруженные с сервера), поэтому у меня даже не было возможности создать 16 шаблонов :)

1 голос
/ 25 ноября 2011

Вы можете попробовать использовать шаблон Attached Behavior . Вы можете привязать прикрепленное свойство к номеру столбца, а прикрепленное поведение будет привязывать текст к необходимой ячейке, учитывая номер столбца.

1 голос
/ 25 ноября 2011

Попробуйте с помощью ListBoxes.

Внешний ListBox включает в себя строки, которые тоже являются ListBoxes, каждая из которых связана с объектом List. И вы можете создать DataTemplate ListBoxItems.

<DataTemplate x:Key="innerListBoxItem">
    [...]
    <TextBlock Text="{Binding Value}" />
    [...]
<DataTemplate>

<DataTemplate x:key="outerListBoxItem">
    <Grid>
        <ListBox ItemTemplate="{StaticResource innerListBoxItem}" ItemCollection="{Binding Cells}"/>
    </Grid>
<DataTemplate>

и везде, где вы хотите поставить этот элемент управления:

<ListBox ItemTemplate="{StaticResource outerListBoxItem}" ItemCollection={Binding CellsList}"/>

код позади:

public class ListOfCells { public List<Cell> Cells {get; set; } }

public List<ListOfCells> CellsList {get; private set; }
0 голосов
/ 25 ноября 2011

Я бы предложил использовать один столбец DataGrid с пользовательскими шаблонами заголовков и ячеек. Ваша сетка не выиграет от изменения размеров отдельных ячеек, не так ли? Ваш заголовок будет иметь фиксированное количество столбцов, шаблон ячейки может быть реализован как подкласс ListControl - нам просто нужно изменить ориентацию StackPanel с вертикальной на горизонтальную. Тогда ваш связанный объект будет набором байтов, что легко, поскольку ваш элемент управления ячейкой является производным от ListControl.

Пожалуйста, дайте нам знать, если это имеет смысл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...