WPF мультисвязывание на ColumnDefinitions - PullRequest
2 голосов
/ 08 августа 2011

У меня есть 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 с соответствующим конвертером и вычислите все ... но это звучит очень противно, и зазвонил мой сигнал "О, Боже, ты идешь".

Любая идея сделать это элегантно?

Спасибо!

РЕДАКТИРОВАТЬ: Код Юрека немного изменен: (Это то, что вы имели в виду? Или я его уничтожил?:р)

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 ]

4 голосов
/ 08 августа 2011

Вы не можете устанавливать ColumnDefinitions, используя привязку, потому что она доступна только для чтения. Но есть элегантное решение - использовать свойство attched зависимость.

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>
0 голосов
/ 08 августа 2011

Если я правильно понимаю, ваш аудиофайл может быть разбит на несколько частей, поэтому это массив.

Я бы создал коллекцию ColumnDefinition, каждая из которых имеет функцию ширины звуковой части.Затем коллекцию можно назначить свойству Grid ColumnDefinitions.

РЕДАКТИРОВАТЬ: я забыл, что свойство Grid только для чтения.Таким образом, вы можете добавлять / удалять элементы среды выполнения.

...