Silverlight 4绑定到ConverterParameter

时间:2010-12-22 12:52:31

标签: silverlight dynamic binding converter

我有一个ValueConverter需要使用动态参数调用,具体取决于属性。我看不到这样做的方法......

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

“分数”转换器获取(或应该获得)System.Size类型的参数,该参数包含分子和分子。此值(应该)取决于ItemCollection.Count。重置ItemCollection应该使用新值重新调用Converter。

我的第一个想法是在我的ItemCollection DependencyProperty的PropertyChanged事件中手动更改CodeBehind中的ConverterParameter。但是,正如我现在所知,Silverlight没有GetBinding()方法。 我听说过GetBindingExpression并尝试过。但MyGrid.GetBindingExpression(Grid.ActualHeightProperty)始终返回null,尽管Binding已经建立。

那么,我能做些什么才能达到目标?


我的实施并没有太大的不同。在通过Binding调用Converter之前,我在CodeBehind中设置了ConverterParameter。这没用(参数包含初始化值)。

我会尝试使用你的建议。但是为什么ConverterParameter不能成为DependencyPropery。这背后有什么想法?有人知道吗?

3 个答案:

答案 0 :(得分:2)

如果..
 “取决于属性”的含义是除了ActualWidthValue之外还有DataContext的另一个属性,您需要它来计算要分配给宽度的值
..then:

修改您调用“Fraction”的IValueConverter以取代整个对象。它可以获取ActualWidthValue的值以及它需要的任何其他值,然后返回所需的宽度。

修改

从你的评论我看到我的第一个“if ..”段落是假的。实际上,这个转换器应该使用的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 :(得分:1)

听起来您可能想要使用MultiBinding。这是一个WPF功能,但与许多事情一样,第三方实现:

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

然后,您可以将ActualWidthValue和项目集合计数作为单独的参数传递。

答案 2 :(得分:-4)

也许你能做到:

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