为什么TextBlock会显示代码隐藏属性值,但边框/填充不能使用它?

时间:2010-01-28 06:22:19

标签: c# silverlight properties inotifypropertychanged

在下面的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

    }
}

2 个答案:

答案 0 :(得分:2)

在xaml中定义值时,int工作,但是当你在代码中执行它时,它不会。但是,如果将属性从int更改为ThickNess,则可以正常工作。

答案 1 :(得分:1)

如果我不得不猜测我会说它因为厚度的转换器不能处理Int32 - &gt;厚度转换。如果你将OuterPadding作为厚度而不是int?会发生什么?

编辑刚检查了Reflector,看起来厚度调换器是硬编码来处理从String或Double到Thickness的转换,而不是Int32。

我误解了我在Reflector中看到的内容。它看起来应该处理Int32确定。