【问题标题】:WPF a Multibinding on ColumnDefinitionsWPF 对 ColumnDefinitions 的多重绑定
【发布时间】: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


【解决方案1】:

您不能使用绑定设置 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>

【讨论】:

  • 我收到一条错误消息,告诉我 ColumnDefinitions 不包含“AddRange”的定义 =/ 这看起来很酷!
  • 我用 foreach (ColumnDefinition col in (ColumnDefinitionCollection)e.NewValue) { element.ColumnDefinitions.Add(col); }
  • 现在在第一次测试时,编译器给我一个错误,说 ColumnDefinitionCollection 没有定义构造函数,此外,在 XAML 本地:GridHelper.ColumnDefinitions 不是一个选项,我只得到附加:GridHelper.InputBindings
  • 请看我更新的问题,我不得不稍微修改一下你的代码(把代码放在 cmets 里搞砸了......)
  • GetColumnDefinitions 和 SetColumnDefinitions 永远不会被调用,并且我在转换器中返回的任何 columndefinition 集合最终都没有区别 =/
【解决方案2】:

如果我理解正确,您的音频文件可以分成几个部分,即一个数组。

我会创建一个 ColumnDefinition 集合,每个集合都有音频部分的宽度函数。然后可以将集合分配给 Grid 的 ColumnDefinitions 属性。

编辑:我忘记了 Grid 属性是只读的。因此,您可以添加/删除项目运行时。

【讨论】:

    猜你喜欢
    • 2010-11-13
    • 1970-01-01
    • 2013-04-04
    • 1970-01-01
    • 2011-05-08
    • 2010-12-05
    • 2012-11-11
    • 2016-03-04
    相关资源
    最近更新 更多