我有一个ValueConverter,用于在StoryBoard动画中绑定“to”值,类似于答案- WPF animation: binding to the “To” attribute of storyboard animation。
问题是,我在几个地方重复下面的MultiBinding ValueConverter代码。
<MultiBinding Converter="{StaticResource multiplyConverter}">
<Binding Path="ActualHeight" ElementName="ExpanderContent"/>
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
</MultiBinding>我想通过将ValueConverter的结果存储到一个资源变量来删除这个重复的代码,这样我就可以将这个局部变量直接绑定到故事板上。
<system:Double x:Key="CalculatedWidth">
<MultiBinding Converter="{StaticResource multiplyConverter}">
<Binding Path="ActualHeight" ElementName="ExpanderContent"/>
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</system:Double >我得到了以下错误:
类型'Double‘不支持直接内容。 无法向类型为"Double“的对象添加内容。
我觉得这是一个常见的问题,但无法找到解决办法来消除这种冗余。
更新
谢谢Rohit,你的回答解决了这个问题。但我还有一个相关的问题,所以更新这个问题。这个变量CalculatedWidth在正常情况下运行良好,但是当它在RenderTransform中使用时,它不会提取值。也就是说,如果我使用正常的方式使用转换器,它可以工作,但它不会捡起变量。
<StackPanel.RenderTransform>
<TranslateTransform x:Name="SliderTransform">
<TranslateTransform.X>
<Binding Converter="{StaticResource PanelConverter}" ElementName="SliderPanel" Path="ActualWidth" /> // Works
<Binding Path="Width" Source="{StaticResource CalculatedWidth}"/> // Doesn't Work
</TranslateTransform.X>
</TranslateTransform>
</StackPanel.RenderTransform>我将变量保留为本地资源的一部分。这是否意味着在调用呈现转换时不会创建变量?
发布于 2014-01-03 07:48:53
正如错误提示的那样,您不能绑定到Double。只能使用依赖项属性进行绑定。
相反,在资源中使用FrameworkElement并按如下方式绑定其宽度(DP):
<FrameworkElement x:Key="CalculatedWidth">
<FrameworkElement.Width>
<MultiBinding Converter="{StaticResource multiplyConverter}">
<Binding Path="ActualHeight" ElementName="ExpanderContent"/>
<Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</FrameworkElement.Width>
</FrameworkElement>您可以绑定此资源,如本示例中所示:
<TextBlock Width="{Binding Width, Source={StaticResource CalculatedWidth}}"/>发布于 2014-01-16 02:54:03
System.Double不实现INotifyPropertyChange (也不显示要通知的值属性),也不实现动态属性高级绑定机制。所以它不能通知它的变化。
本地资源的问题在于它们的实例化:由于它们是在其外部实例化的,所以它们无法对托管显像管具有可见性。所以不绑定到任何东西,绑定返回DependancyProperty.UnsetValue。
它相对于FrameworkElement资源本身,并返回其标记属性值: null。
如果您将VS2013与at 4.5一起使用(也许它也适用于at 2012/ .NET 4.0),请查看输出窗口中的数据绑定跟踪:
System.Windows.Data警告:4:无法找到引用“ElementName=ExpanderContent”绑定的源代码。BindingExpression:Path=ActualHeight;DataItem=null;目标元素为'FrameworkElement‘(名称=’‘);目标属性为’宽度‘(键入'Double')
为您提供了不同的解决方案:您可以将FrameworkElement移出本地资源(请记住,您可能必须添加HorizontalAlign=“左”以允许宽度更改。另一种解决方案是向代码behind.Finally中添加依赖属性,您希望在多个控件(或属性)之间共享乘数转换器的结果:最简单的方法可能是将其绑定为第一个控件的第一个属性,并将其他控件属性绑定到该第一个属性。
https://stackoverflow.com/questions/20898372
复制相似问题