【发布时间】:2011-08-08 14:24:32
【问题描述】:
我有一个 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 中的每一个绑定到它们各自的转换器,然后计算所有内容……但这听起来很讨厌,我的“哦- My-God-You're-Going-Down”警报响了。
任何想法优雅地做到这一点?
谢谢!
编辑: 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);
}
}
【问题讨论】:
-
我们应该首先定义“优雅”。无论如何,你能更好地解释一下宽度的来源吗?
-
这是一个分成几部分的音频文件。
标签: wpf multibinding