Привязка Silverlight 4 к ConverterParameter - PullRequest
1 голос
/ 22 декабря 2010

У меня есть ValueConverter, который нужно вызывать с динамическим параметром, в зависимости от свойства.Я не вижу способа сделать это ...

Width="{Binding ActualWidthValue, Source={StaticResource VisibleSize}, Converter={StaticResource Fraction}}"

Конвертер "Fraction" получает (или должен получать) параметр типа System.Size, который содержит числитель и денумератор.Это значение (должно) зависит от ItemCollection.Count.Сброс ItemCollection должен повторно вызвать Converter с новыми значениями.

Моя первая идея состояла в том, чтобы вручную изменить ConverterParameter в CodeBehind для события PropertyChanged моего ItemCollection DependencyProperty.Но, как я теперь знаю, в Silverlight нет метода GetBinding ().Я слышал о GetBindingExpression и пытался сделать.Но MyGrid.GetBindingExpression (Grid.ActualHeightProperty) всегда возвращает ноль, хотя привязка уже установлена.

Итак, что я могу сделать, чтобы достичь своей цели?


Моя реализация не сильно отличалась.Я устанавливаю ConverterParameter в CodeBehind непосредственно перед тем, как конвертер вызывается через Binding.Это не сработало (параметр по-прежнему содержит значение инициализации).

Я попытаюсь использовать ваше предложение.Но почему ConverterParameter не может быть DependencyPropery.Что за идея стоит за этим?Кто-нибудь знает?

Ответы [ 3 ]

2 голосов
/ 22 декабря 2010

Если ..
, что вы подразумеваете под "зависимостью от свойства", это то, что есть другое свойство DataContext, кроме ActualWidthValue, которое вам нужно для вычисления значения, которое вы хотите присвоить Width
..then:

Измените IValueConverter, который вы называете "Дробь", чтобы вместо этого взять весь объект.Он может получить значение ActualWidthValue и любые другие необходимые ему значения, а затем вернуть требуемую ширину.

Редактировать

Из вашего комментария я вижу мой первыйабзац "если .." ложный.На самом деле у вас есть общее значение в UserControl, которое должен использовать этот конвертер.В этом случае добавьте свойство в конвертер, это ведь просто еще один класс.Когда свойство в UserControl установлено, вы назначаете его значение этому свойству.Например: -

Некоторые преобразователи значений: -

 public class SomeConverter : IValueConverter
 {

     public int SomeFactor { get; set }
     // IValueConverter implementation here uses SomeFactor
 }

UserControl xaml: -

 <UserControl.Resources>
    <local:SomeConverter x:Key="Fraction" SomeFactor="15" />
 </UserControl.Resources>

UserControl CodeBehind: -

 public int SomeFactor
 {
      get { return ((SomeConverter)Resources["Fraction"]).SomeFactor; }
      set { ((SomeConverter)Resources["Fraction").SomeFactor = value; }
 }
1 голос
/ 22 декабря 2010

Звучит так, как будто вы хотите использовать MultiBinding. Это функция WPF, но, как и у многих других, есть сторонние реализации:

http://www.scottlogic.co.uk/blog/colin/2010/05/silverlight-multibinding-solution-for-silverlight-4/

Затем можно передать ActualWidthValue и счетчик коллекции элементов в качестве отдельных параметров.

0 голосов
/ 27 июля 2011

Возможно, вы могли бы сделать:

<Image.Width>
<Binding Path="Rank" Converter="{StaticResource RankWidthConverter}" ConverterParameter="{Binding Path=Width, ElementName=barBorder}" />
</Image.Width>
...