Binding vs MultiBinding => Различные результаты - PullRequest
0 голосов
/ 18 января 2012

У меня есть TextBlock внутри StackPanel. Поскольку я использую TextTrimming, я должен вручную установить ширину TextBox в соответствии с StackPanel.ActualWidth.

<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 с тем же кодом):

Мой конвертер может получить StackPanel, но ActualWidth всегда равен нулю

<TextBlock.Width>

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

1 Ответ

0 голосов
/ 18 января 2012

попробуй

Width="{Binding Path=ActualWidth, 
                RelativeSource={RelativeSource FindAncestor, AncestorType=StackPanel}}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...