WPF对ColumnDefinitions的多重绑定

时间:2011-08-08 14:24:33

标签: wpf multibinding

我有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);
        }
    }

2 个答案:

答案 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属性是只读的。因此,您可以添加/删除项目运行时。