Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > WPF Label и привязки


Автор: Anyone 19.10.2009, 13:24
В шаблоне имеется лейбл на канвасе:
Код

<Label x:Name="PART_LinkEnd" Background="White" Margin="0,-12,0,0"
       Content="{Binding Path=(local:Connection.ConnectorStart), Converter={StaticResource ConverterConnector}}"
       Canvas.Left="{Binding Path=(local:Connection.EndPointEnd), Converter={StaticResource ConverterPointX}}" 
       Canvas.Top="{Binding Path=(local:Connection.EndPointEnd), Converter={StaticResource ConverterPointY}}"
       Foreground="{TemplateBinding local:Connection.LineBrush}" HorizontalAlignment="Right" VerticalAlignment="Center"/>

И по этому поводу есть пару вопросов.

1.
Мне необходимо чтоб текст метки выравнивался справа от привязанной точки.
Свойства HorizontalAlignment и VerticalAlignment почему-то вообще ни на что не влияют.
На канвасе они ничего не решают?
Использовать Margin в разметке - не выход - текст меняется.
У меня единственная идея - забиндить свойство Margin и с помощью конвертера программно его изменять, но не думаю что это самый правильный способ.

2.
Привожу часть кода конвертера ConverterConnector:
Код

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Parameter param=null;
            var connector = value as Connector;
            if (connector != null)
                param = Connector.GetParameter(connector);
            if (param != null)
            {
                var canvasItem = param.DataContext as CanvasItem;
                if (canvasItem!=null)
                    return string.Format("{0}.{1}", canvasItem.Number, param.Tag);
            }
            return null;
        }

Видно что Content метки привязывается к номеру элемента канваса (метка находится на другом канвасе), а сам элемент извлекается из значения DataContext. 
Проблема в том, что если номер изменится, содержимое метки не обновляется.
Я могу обновить все метки когда идет пересчет номеров, но хотелось бы избавиться от лишних циклов.

Спасибо.

Автор: math64 19.10.2009, 13:50
1. Если нужно выравнивать справа от заданной точки, используется Canvas.Left, если слева - Canvas.Right.
HorizontalAlignment и VerticalAlignment используются когда метке предоставлено пространство больше чем ей нужно.
Можно ещё положить метку в грид из одной ячейки, который будет лежать на канве.
2. Попробуй использовать IMultiValueConverter.

Автор: Anyone 19.10.2009, 14:10
math64, 
Совсем вылетело из головы что можно задать Canvas.Right вместо Canvas.Left...
Но при этом все правильно работает в этом случае, если координату Х домножать на -1. Видимо, придется доучивать мат. часть...

IMultiValueConverter и MultiBinding действительно должен помочь.

Спасибо за помощь.

Автор: Anyone 19.10.2009, 14:37
Цитата(Anyone @  19.10.2009,  14:10 Найти цитируемый пост)
IMultiValueConverter и MultiBinding действительно должен помочь.

Но не помогло:
Код

<Label.Content>
    <MultiBinding Converter="{StaticResource MultiValueConverterConnector}">
        <Binding Path="(local:Connection.ConnectorEnd)"/>
        <Binding Path="(local:Connection.ConnectorEnd.DataContext)"/>
    </MultiBinding>
</Label.Content>

При этом возникает такой эксепшн времени выполнения:
Cannot convert string '(local:Connection.ConnectorEnd.DataContext)' in attribute 'Path' to object of type 'System.Windows.PropertyPath'. Property path is not valid. Cannot resolve type name 'local:Connection.ConnectorEnd'.

Программно тоже пока тоже не получается, UpdateLayout() не помогает.

Автор: math64 19.10.2009, 15:46
Что означают круглые скобки? Вроде должны быть фигурные.

Автор: Anyone 19.10.2009, 16:09
Цитата(math64 @  19.10.2009,  15:46 Найти цитируемый пост)
Что означают круглые скобки? Вроде должны быть фигурные.

Книга пишет:
Цитата

составное или присоединенное свойство (такое как Canvas.Left) заключается в круглые скобки

Без них не правильно работает.

Хотя старнно, что в большинстве остальных случаев и без скобок работает (к примеру, в триггерах).
А если это не составное (что скорее всего), то почему без скобок не работает?  smile 

Автор: math64 20.10.2009, 07:17
Но фигурные скобки всё равно нужны - без них будет просто строка, а не биндинг.
Код

<MultiBinding Converter="{StaticResource MultiValueConverterConnector}" ConverterParameter="{0}.{1}">
  <Binding Path="{Binding ...}"/>
  <Binding Path="{Binding ...}"/>
</MultiBinding>

Но что писать в фугурных скобках в твоём случае не знаю.

Автор: Anyone 20.10.2009, 08:52
Цитата(math64 @  20.10.2009,  07:17 Найти цитируемый пост)
 <Binding Path="{Binding ...}"/>

Так не работает. Работает только так, как я написал.
Хотя я согласен с тем, что скобки там не нужны, а фигурные - тем более а  Path="{Binding ...}" - это вообще какой-то бред: там же задается путь к свойству...

Автор: math64 20.10.2009, 09:49
Так как ты написал - тоже не работает:
Цитата(Anyone @  19.10.2009,  14:37 Найти цитируемый пост)
Cannot convert string '(local:Connection.ConnectorEnd.DataContext)' in attribute 'Path' to object of type 'System.Windows.PropertyPath'. Property path is not valid. Cannot resolve type name 'local:Connection.ConnectorEnd'.

т.е. невозможно преобразовать строку к типу System.Windows.PropertyPath. Нужно начинать с фигурной скобки, а что дальше - не знаю.
В примере из книжки есть такой мультибиндинг:
Код

<MultiBinding Converter="{StaticResource MultiValueConverterConnector}" ConverterParameter="{}{0}.{1}">
  <Binding Source="{x:Static ...}"/>
  <Binding Source="{x:Static ...}"/>
</MultiBinding>

но тебе нужно привязываться не к статическому ресурсу.
Посмотрел ещё примеры по обычному (не мульти) биндингу.
Path по-видимому, задан правильно, но нужно добавить Source, а то путь ищется не в том объекте.

Автор: Anyone 20.10.2009, 12:10
Все оказалось настолько просто, что аж смешно:
Код

<Label.Content>
    <MultiBinding Converter="{StaticResource MultiValueConverterConnector}">
        <Binding Path="(local:Connection.ConnectorEnd)"/>
        <Binding Path="(local:Connection.ConnectorEnd).DataContext.Number"/>
     </MultiBinding>
</Label.Content>


А круглые скобки все-таки нужны!

Автор: math64 20.10.2009, 13:26
Да круглые скобки оказались нужны, а фигурные - нет.
Можно добавить параметром в конвертер строку форматирования и получится универсальный форматирующий конвертер.
Строку форматирования нужно начинать с "{}...", чтобы она не воспринималась как биндинг.

Автор: Anyone 20.10.2009, 14:18
Цитата(math64 @  20.10.2009,  13:26 Найти цитируемый пост)
Можно добавить параметром в конвертер строку форматирования и получится универсальный форматирующий конвертер.Строку форматирования нужно начинать с "{}...", чтобы она не воспринималась как биндинг.

О, пасибки, а то сам бы долго еще разбирался, тем  более с этими фигурными скобками.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)