首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将ValueConverter存储到变量

将ValueConverter存储到变量
EN

Stack Overflow用户
提问于 2014-01-03 07:03:57
回答 2查看 374关注 0票数 6

我有一个ValueConverter,用于在StoryBoard动画中绑定“to”值,类似于答案- WPF animation: binding to the “To” attribute of storyboard animation

问题是,我在几个地方重复下面的MultiBinding ValueConverter代码。

代码语言:javascript
复制
    <MultiBinding Converter="{StaticResource multiplyConverter}">
       <Binding Path="ActualHeight" ElementName="ExpanderContent"/>
       <Binding Path="Tag" RelativeSource="{RelativeSource Self}" />
    </MultiBinding>

我想通过将ValueConverter的结果存储到一个资源变量来删除这个重复的代码,这样我就可以将这个局部变量直接绑定到故事板上。

代码语言:javascript
复制
<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中使用时,它不会提取值。也就是说,如果我使用正常的方式使用转换器,它可以工作,但它不会捡起变量。

代码语言:javascript
复制
<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>

我将变量保留为本地资源的一部分。这是否意味着在调用呈现转换时不会创建变量?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-03 07:48:53

正如错误提示的那样,您不能绑定到Double。只能使用依赖项属性进行绑定。

相反,在资源中使用FrameworkElement并按如下方式绑定其宽度(DP):

代码语言:javascript
复制
<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>

您可以绑定此资源,如本示例中所示:

代码语言:javascript
复制
<TextBlock Width="{Binding Width, Source={StaticResource CalculatedWidth}}"/>
票数 3
EN

Stack Overflow用户

发布于 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中添加依赖属性,您希望在多个控件(或属性)之间共享乘数转换器的结果:最简单的方法可能是将其绑定为第一个控件的第一个属性,并将其他控件属性绑定到该第一个属性。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20898372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档