【问题标题】:Binding vs MultiBinding => Different resultsBinding vs MultiBinding => 不同的结果
【发布时间】:2012-01-18 11:42:29
【问题描述】:

我在StackPanel 中有一个TextBlock。由于我使用的是TextTrimming,所以我必须根据StackPanel.ActualWidth 手动设置TextBox 的宽度。

<StackPanel HorizontalAlignment="Stretch">
    <TextBlock HorizontalAlignment="Left">
        <TextBlock.Width>
            <MultiBinding Converter="{StaticResource WidthConverter}">
                <MultiBinding.Bindings>
                    <Binding RelativeSource="{RelativeSource Self}" />
                    <Binding RelativeSource="{x:Static RelativeSource.Self}" Path="TemplatedParent.Parent.ActualWidth"  />
              </MultiBinding.Bindings>
             </MultiBinding>                
        </TextBlock.Width>
    </TextBlock>

我的转换器:

Public Class WidthConverter
    Implements IMultiValueConverter

    Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert

        Const TextBoxMarginRight As Double = 5

        Dim ParentWidth As Double = CType(CType(values(0), FrameworkElement).Parent, FrameworkElement).ActualWidth

        Dim ParentRelativeControlPosition As Point = CType(values(0), FrameworkElement).TransformToAncestor(CType(CType(values(0), FrameworkElement).Parent, Media.Visual)).Transform(New Point(0, 0))

        Dim Width As Double = ParentWidth - TextBoxMarginRight - ParentRelativeControlPosition.X

        If Width > 5 Then
            Return Width
        Else
            Return 0
        End If

    End Function

为什么这是正常工作而不是下面的代码? (使用具有相同代码的IValueConverter):

我的转换器可以得到StackPanelActualWidth 始终为零

<TextBlock.Width>

    <Binding RelativeSource="{x:Static RelativeSource.Self}" Path="TemplatedParent.Parent.ActualWidth"  Converter="{StaticResource WidthConverter}" />          
</TextBlock.Width>

【问题讨论】:

  • 我认为 MultiBinding 是在 TextBlock 渲染之后进行的,并且(单个)Binding 在 TextBlok 渲染之前进行
  • 您好,我可能遇到了同样的问题,绑定到图像源。我发了一个关于它的话题和一个小项目来测试:stackoverflow.com/questions/10128307/…

标签: .net wpf xaml binding


【解决方案1】:

试试

Width="{Binding Path=ActualWidth, 
                RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}"

【讨论】:

    猜你喜欢
    • 2017-08-04
    • 2011-07-13
    • 2019-01-13
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多