我有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
中的每一个绑定到各自的转换器,并计算所有内容......但这听起来非常讨厌我的“哦 - 我 - 上帝 - 你要下来”的警报响了。
想要优雅地做到这一点吗?
谢谢!
编辑: 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);
}
}
答案 0 :(得分:4)
您无法使用绑定设置ColumnDefinitions,因为它是只读的。但是有一个优雅的解决方案 - 使用附加的依赖属性。
public class GridHelper
{
public static readonly DependencyProperty ColumnDefinitionsProperty =
DependencyProperty.RegisterAttached("ColumnDefinitions", typeof(ColumnDefinitionCollection), typeof(GridHelper),
new FrameworkPropertyMetadata(null,
(sender, e) =>
{
var element = sender as Grid;
if(element != null)
{
element.ColumnDefinitions.Clear();
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);
}
}
现在您可以使用绑定来创建列定义:
<Grid>
<local:GridHelper.ColumnDefinitions>
<MultiBinding Converter="{StaticResource yourConverter}">
<Binding Path=firstValueForCalculus />
<Binding Path=secondValueForCalculus />
...
</MultiBinding>
</local:GridHelper.ColumnDefinitions>
</Grid>
答案 1 :(得分:0)
如果我理解正确,你的音频文件可以拆分成几个部分,所以是一个数组。
我会创建一个ColumnDefinition集合,每个集合都有一个音频部分的宽度函数。然后可以将集合分配给Grid的ColumnDefinitions属性。
编辑:我忘记了Grid属性是只读的。因此,您可以添加/删除项目运行时。