Привязка к ColumnDefinition.ActualWidth возвращает 0

Вставьте это в сидр.

<Grid x:Name="Grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="ColumnDefinition"/>
    </Grid.ColumnDefinitions>
    <StackPanel HorizontalAlignment="Center" VerticalAlignment="Center">
        <TextBlock Text="{Binding ActualWidth, ElementName=Grid}"/>
        <TextBlock Text="{Binding ActualWidth, ElementName=ColumnDefinition}"/>
    </StackPanel>
</Grid>

Теперь запустите его. Второй TextBlock показывает 0, но не должен, верно? Обходной путь?

3 ответа

Нет, ты не сделал. ColumnDefinition имеет ActualWidth собственно, собственно. Но это ни DependencyProperty ни там INotifyPropertyChanged реализация. Так что никто не сообщит вашей цели, когда ActualWidth обновляется.

Обходной путь? Для чего? Вы всегда можете использовать ElementName привязка к родителю FrameworkElementу кого именно это ActualWidth что ты хотел. Извините за сложную фразу:). Не мог сделать это проще.

Надеюсь это поможет.

ColumnDefinition.ActualWidth Свойство не является свойством зависимости, и ваша привязка покажет только его начальное значение, равное 0, прежде чем сетка будет обновлена ​​для макета. Grid.ActualWidth свойство с другой стороны является свойством зависимости, и привязка будет обновляться при изменении ширины.

Со страницы MSDN:

Когда вы добавляете или удаляете строки или столбцы, ActualWidth для всех элементов ColumnDefinition и ActualHeight всех элементов RowDefinition становятся равными нулю, пока не будет вызвана Measure.

Казалось бы, значение привязано перед Measure как-то называется. Попробуй заставить Mode = OneWay на вашу привязку, а также проверку вручную в коде, чтобы подтвердить это поведение.

Другие вопросы по тегам