次のGridようなセグメントを保持する があります。
--
---
-----------
---
-------------------
各セグメントの視覚的な長さは全長に依存し、その位置は前のセグメントの終わりに依存します。
MultiBindingこれを達成するには、 Width of 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し、すべてを計算することだと思っています...しかし、それは非常に厄介に聞こえます。 -ダウン」アラームが鳴りました。
これをエレガントに行うアイデアはありますか?
ありがとう!
編集: Yurek のコードを少し修正しました: (それはあなたが意図したものですか? または私はそれを破壊しましたか? :p)
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);
}
}