Почему TextBlock может показывать значение свойства code-behind, но border / padding не может его использовать? - PullRequest
2 голосов
/ 28 января 2010

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

Этот же код отлично работает в 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

    }
}

Ответы [ 2 ]

2 голосов
/ 28 января 2010

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

1 голос
/ 28 января 2010

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

РЕДАКТИРОВАТЬ Только что проверил Reflector, и кажется, что ThicknessConverter жестко запрограммирован для обработки преобразования из String или Double в Thickness, но не Int32.

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

...