2010-01-04 2 views
1

Я пытаюсь привязать DataBlock к RenderSize прямоугольника. Вот код.Почему моя привязка не обновляется на UIElement.RenderSize или UIElement.ActualWidth?

<StackPanel x:Name="root"> 
     <Rectangle x:Name="rect" Fill="Green" RenderTransformOrigin="0.5,0.5" Height="100" Width="100" /> 

     <TextBlock Text="{Binding ElementName=rect, Path=Width}"></TextBlock> 
     <TextBlock Text="{Binding ElementName=rect, Path=ActualWidth}"></TextBlock> 
     <TextBlock Text="{Binding ElementName=rect, Path=RenderSize}"></TextBlock> 
     <Slider Value="{Binding ElementName=rect, Path=Width, Mode=TwoWay}" Maximum="200"></Slider> 
     <Button Content="Manually Get RenderSize" Click="Button_Click_1"></Button> 
     <TextBlock x:Name="info"></TextBlock> 
    </StackPanel> 

Когда я перемещаю ползунок, прямоугольник становится больше, и первый TextBox обновляется правильно. Тем не менее, ActualWidth и RenderSize остаются равными 0 и 0,0.

Когда я нажимаю кнопку «Я», я получаю программный код RenderSize и показываю его в последнем текстовом блоке, который отличается от 0,0.

private void Button_Click_1(object sender, RoutedEventArgs e) 
{ 
    info.Text = rect.RenderSize.ToString(); 
} 

Так что моя привязка к RenderSize не обновляет TextBox правильно ... Почему? Спасибо за вашу помощь,

ответ

2

Я написал ответ на аналогичный вопрос здесь:

Binding to ActualWidth does not work

Это должно быть полезно для вас.

+0

снова еще один взлом в silverlight, он начинает заставлять меня сходить с ума ... –

+0

может быть проще, если вы просто обрабатываете событие SizeChanged в элементе и обновляете значение, соответствующее соответствующему обработчику события. Решение, описанное в сообщении, которое я связал, необходимо только в том случае, если вы должны использовать привязку данных. – KeithMahoney

2

RenderSize не свойства зависимостей, но она соответствует свойствам зависимостей (ActualWidth, ActualHeight)

Так связываться с RenderSize мы можем использовать MultiBinding к (ActualWidth, ActualHeight)

<TextBlock> 
    <TextBlock.Text> 
    <MultiBinding Converter="{x:Static MyConv:SizePartsToSizeConverter.Instance}"> 
        <Binding Path="ActualWidth" RelativeSource="{RelativeSource Self}"/> 
        <Binding Path="ActualHeight" RelativeSource="{RelativeSource Self}"/> 
    </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

public class SizePartsToSizeConverter:IMultiValueConverter 
{ 
    private static SizePartsToSizeConverter m_instance = new SizePartsToSizeConverter(); 
    public static SizePartsToSizeConverter Instance { get { return m_instance; } } 

    public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var values = value.Where(x => x is Double).Cast<double>().ToList(); 
     if (values.Count()!=2) return DependencyProperty.UnsetValue; 

     return new Size(values[0],values[1]); 
    } 

    public object[] ConvertBack(object value, Type[] targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
Смежные вопросы