Почему TextBlock может отображать значение свойства кода программной части, но граница/заполнение не может его использовать?

В следующем приложении Silverlight почему свойство OuterPadding не изменяет заполнение внешней границы, хотя TextBlock правильно отображает значение OuterPadding? Если я изменяю заполнение границы на простое целое число, заполнение работает хорошо, но не тогда, когда это определяется свойством в коде позади.

Этот же код отлично работает в WPF.

XAML:

<UserControl x:Class="Test222.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:pages="clr-namespace:Test222.Pages"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    Width="600" Height="480">
    <Border Background="#eee" Padding="{Binding OuterPadding}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
                <RowDefinition Height="34"/>
                <RowDefinition Height="426"/>
            </Grid.RowDefinitions>
            <StackPanel Grid.Row="0" Grid.Column="0">
                <StackPanel x:Name="QuickMenu" Orientation="Horizontal"/>
            </StackPanel>
            <Border Grid.Row="1" Grid.Column="0"
                Background="#fff"
                Padding="10" 
                Width="580"
                Height="426"
                VerticalAlignment="Top"
                CornerRadius="5">
                <TextBlock Text="{Binding OuterPadding}"/>
            </Border>
        </Grid>
    </Border>
</UserControl>

Код позади:

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace Test222
{
    public partial class MainPage : UserControl, INotifyPropertyChanged
    {

        #region ViewModelProperty: OuterPadding
        private int _outerPadding;
        public int OuterPadding
        {
            get
            {
                return _outerPadding;
            }

            set
            {
                _outerPadding = value;
                OnPropertyChanged("OuterPadding");
            }
        }
        #endregion

        public MainPage()
        {
            InitializeComponent();
            DataContext = this;

            RefreshApplication();
        }

        void RefreshApplication()
        {
            OuterPadding = 5;


            for (int i = 0; i < 5; i++)
            {
                var button = new Button();
                button.Content = "Button " + i;
                button.Margin = new Thickness { Right = 3 };
                QuickMenu.Children.Add(button);
            }
        }


        #region INotifyPropertyChanged Member

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;

            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion

    }
}

person Edward Tanguay    schedule 28.01.2010    source источник


Ответы (2)


Int работает при определении значения в xaml, но когда вы делаете это в коде, это не так. Но если вы измените свое свойство с int на ThickNess, оно будет работать нормально.

person Henrik Söderlund    schedule 28.01.2010
comment
Использование int в коде работает в WPF, но, по-видимому, не в Silverlight (3). Толщина работает в обоих случаях. Забавно, что использование int в коде в Silverlight фактически приводило к сбою Visual Studio (2008) на одной машине. - person Edward Tanguay; 28.01.2010

Если бы мне пришлось угадывать, я бы сказал, что это потому, что преобразователь значений для толщины не обрабатывает преобразование Int32 -> Thickness. Что произойдет, если вы сделаете OuterPadding толщиной вместо int?

EDIT Только что проверил Reflector, и кажется, что ThicknessConverter жестко закодирован для обработки преобразования из String или Double в Thickness, но не из Int32.

Я неправильно понял то, что увидел в Reflector. Похоже, он должен нормально обрабатывать Int32.

person Josh    schedule 28.01.2010