У меня есть Grid
, который содержит сегменты, такие как:
--
---
-----------
---
-------------------
Визуальная длина каждого сегмента зависит от общей длины, а его положение зависит от конца предыдущего сегмента.
У меня есть MultiBinding
для достижения этой цели, который вычисляет ширину 3 ColumnDefinition
.
Сначала я подумал, что вычислю все ColumnDefinitions
так, чтобы каждый элемент был размещен правильно, но какбывает, компилятор не позволяет мне связывать Grid.ColumnDefinitions, то есть вы не можете сделать это:
<Grid.ColumnDefinitions>
<MultiBinding Converter="{StaticResource yourConverter}">
<Binding Path=firstValueForCalculus />
<Binding Path=secondValueForCalculus />
...
</MultiBinding>
</Grid.ColumnDefinitions>
Итак, теперь я думаю, что мой единственный вариант - сделать 3 IMultiValueConverters
, свяжите каждый из 3 ColumnDefinition.Width
с соответствующим конвертером и вычислите все ... но это звучит очень противно, и зазвонил мой сигнал "О, Боже, ты идешь".
Любая идея сделать это элегантно?
Спасибо!
РЕДАКТИРОВАТЬ: Код Юрека немного изменен: (Это то, что вы имели в виду? Или я его уничтожил?:р)
public class GridHelper
{
public static readonly DependencyProperty ColumnDefinitionsProperty =
DependencyProperty.RegisterAttached("ColumnDefinitions", typeof(ColumnDefinitionCollection), typeof(GridHelper),
new FrameworkPropertyMetadata(null, new PropertyChangedCallback(
(sender, e) =>
{
var element = sender as Grid;
if (element != null)
{
element.ColumnDefinitions.Clear();
foreach (ColumnDefinition col in (IEnumerable<ColumnDefinition>)e.NewValue)
{
element.ColumnDefinitions.Add(col);
}
//element.ColumnDefinitions.AddRange((IEnumerable<ColumnDefinition>)e.NewValue);
}
})));
public static IEnumerable<ColumnDefinition> GetColumnDefinitions(Grid element)
{
return (IEnumerable<ColumnDefinition>)element.GetValue(ColumnDefinitionsProperty);
}
public static void SetColumnDefinitions(Grid element, IEnumerable<ColumnDefinition> columnDefinitions)
{
element.SetValue(ColumnDefinitionsProperty, columnDefinitions);
}
}