Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> WPF Label и привязки 
V
    Опции темы
Anyone
Дата 19.10.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



В шаблоне имеется лейбл на канвасе:
Код

<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. 
Проблема в том, что если номер изменится, содержимое метки не обновляется.
Я могу обновить все метки когда идет пересчет номеров, но хотелось бы избавиться от лишних циклов.

Спасибо.
PM MAIL   Вверх
math64
Дата 19.10.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



1. Если нужно выравнивать справа от заданной точки, используется Canvas.Left, если слева - Canvas.Right.
HorizontalAlignment и VerticalAlignment используются когда метке предоставлено пространство больше чем ей нужно.
Можно ещё положить метку в грид из одной ячейки, который будет лежать на канве.
2. Попробуй использовать IMultiValueConverter.
PM   Вверх
Anyone
Дата 19.10.2009, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

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

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

Это сообщение отредактировал(а) Anyone - 19.10.2009, 14:12
PM MAIL   Вверх
Anyone
Дата 19.10.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Цитата(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() не помогает.

Это сообщение отредактировал(а) Anyone - 19.10.2009, 14:47
PM MAIL   Вверх
math64
Дата 19.10.2009, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Что означают круглые скобки? Вроде должны быть фигурные.
PM   Вверх
Anyone
Дата 19.10.2009, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

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

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

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

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

Это сообщение отредактировал(а) Anyone - 19.10.2009, 16:21
PM MAIL   Вверх
math64
Дата 20.10.2009, 07:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



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

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

Но что писать в фугурных скобках в твоём случае не знаю.
PM   Вверх
Anyone
Дата 20.10.2009, 08:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

Так не работает. Работает только так, как я написал.
Хотя я согласен с тем, что скобки там не нужны, а фигурные - тем более а  Path="{Binding ...}" - это вообще какой-то бред: там же задается путь к свойству...
PM MAIL   Вверх
math64
Дата 20.10.2009, 09:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Так как ты написал - тоже не работает:
Цитата(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, а то путь ищется не в том объекте.

Это сообщение отредактировал(а) math64 - 20.10.2009, 13:21
PM   Вверх
Anyone
Дата 20.10.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



Все оказалось настолько просто, что аж смешно:
Код

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


А круглые скобки все-таки нужны!
PM MAIL   Вверх
math64
Дата 20.10.2009, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 2
Всего: 72



Да круглые скобки оказались нужны, а фигурные - нет.
Можно добавить параметром в конвертер строку форматирования и получится универсальный форматирующий конвертер.
Строку форматирования нужно начинать с "{}...", чтобы она не воспринималась как биндинг.
PM   Вверх
Anyone
Дата 20.10.2009, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 218
Регистрация: 1.6.2008

Репутация: нет
Всего: нет



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

О, пасибки, а то сам бы долго еще разбирался, тем  более с этими фигурными скобками.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0505 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.