Привязка данных WPF - привязка к элементу управления пользовательского интерфейса из шаблона - PullRequest
0 голосов
/ 04 декабря 2009

У меня есть шаблон в моем разделе. Я хочу привязать ширину одного из значений в этом шаблоне к ширине элемента управления в моем разделе основного XAML.

Можно ли это сделать? Expression Blend показывает только шаблон в списке Binding.

Например, вот что я хочу получить:

<Windows.Resources>
... My template stuff
   <Grid.ColumnDefinitions>
      <ColumnDefinition Width="20" />
      <ColumnDefinition Width="50" />
      <ColumnDefinition Width="{Binding ElementName=SecondColumn, Path=Width}"/>
      <ColumnDefinition Width="30" />
   </Grid.ColumnDefinitions>
... More template stuff
</Windwos.Resources>

<Grid Name="MainGrid">
   <Grid.ColumnDefinitions>
      <ColumnDefinition Name="FirstColumn" Width=".25*" />
      <ColumnDefinition Name="SecondColumn" Width=".5*" />
      <ColumnDefinition Name="ThirdColumn"  Width=".25*" />
   </Grid.ColumnDefinitions>
... Rest of my XAML

Ответы [ 2 ]

1 голос
/ 21 января 2010

Оказавшись внутри шаблона, вы как бы изолированы от других элементов (по уважительной причине - его можно использовать в другом месте). В этом случае (при условии, что шаблон используется где-то под «MainGrid»), похоже, что вы можете использовать привязку RelativeSource FindAncestor для определения местоположения родительской сетки (вам нужно обязательно подсчитать сетки в VisualTree, чтобы получить правильный AncestorLevel - только в коде здесь было бы 2). Путь будет ColumnDefinitions [1] .Width. Помните, что это зависит от того, сохраняете ли вы структуру элементов, в которых вы используете шаблон, поэтому он немного хрупок. Существует также альтернативный метод, использующий SharedSizeGroup, который может соединять строки или столбцы сетки на разных уровнях, но работает только с автоматическим и фиксированным размером пикселей. Этот метод связывания работает с фиксированными и * размерами.

Вся привязка:

Width="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Grid}, AncestorLevel=2}, Path=ColumnDefinitions[1].Width}"
1 голос
/ 04 декабря 2009

Вы имеете в виду, что вы хотите, чтобы ваши столбцы всегда были одинаковой ширины, или вы имеете в виду, что сначала они имеют одинаковую ширину? Если так, почему бы не определить стиль и использовать его из обоих столбцов?

...