我有一个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。这背后有什么想法?有人知道吗?
答案 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>