在WPF UserControl中设置和显示属性

时间:2010-02-24 12:17:33

标签: wpf user-controls properties

我在这里遗漏了什么吗?我已经创建了一个带有属性的usercontrol,并且为了参数,它中有一个文本框。

<UserControl x:Class="Isd.Utility.SystemMonitorWpf.Bar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<TextBlock x:Name="txtExpected" Grid.Column="0" Grid.ColumnSpan="2" Width="auto" Height="auto" FontSize="10" LayoutTransform="{StaticResource Rotate}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Tahoma" Foreground="Red" Panel.ZIndex="100" Margin="5,5,5,5"/>

然后在我背后的代码中

public partial class Bar : UserControl
{
    private string _PropTest;

    public string PropTest
    {
        get { return _PropTest; }
        set { _PropTest = value; }
    } 

public Bar()
    {
        InitializeComponent();
        txtExpected.Text = PropTest;
    }
}

然后我将usercontrol放入xaml并将属性设置为值

<local:Bar PropTest="test"></local:Bar>

在此示例中,当显示usercontrol时,文本显示为null,就像从未设置PropTest属性一样。我错过了一些明显的东西吗?提前谢谢。

6 个答案:

答案 0 :(得分:0)

当用作属性时,PropTest在调用构造函数后设置,因此在将属性应用于文本框时不会设置它。

您最好将事件附加到属性更改,或使用TextBox作为属性的后备值。

答案 1 :(得分:0)

这是因为属性的值永远不会在txtExpected-Control的Text-Property上设置。在调用构造函数时,属性PropTest仍然为null。

因此,您必须更改属性的实现:

public string PropTest
{
    get { return txtExpected.Text; }
    set { txtExptected.Text = value; }
}

答案 2 :(得分:0)

您应该使用DependencyProperties,因此您可以通过xaml

绑定控件属性

在您的班级声明中:

    public static readonly DependencyProperty MyProperty = DependencyProperty.Register(
        "MyProperty",                  //Property name
        typeof(string),                //Property type
        typeof(MyControl),             //Type of the dependency property provider
        new PropertyMetadata(MyPropertyChanged));//Callback invoked on property value has changes

    public string MyProperty
    {
        set
        {
            this.SetValue(MyProperty, value);
        }
        get
        {
            return (string)this.GetValue(MyProperty);
        }
    }

    private static void MyPropertyChanged( object sender, DependencyPropertyChangedEventArgs args )
    {
      // update your control inner elements properties
    }

由于拼写错误而编辑了几次:P

答案 3 :(得分:-1)

当您添加Text属性时会发生什么:

<TextBlock x:Name="txtExpected" Text="{Binding PropTest}" />

并删除该行

txtExpected.Text = PropTest;

来自构造函数?

答案 4 :(得分:-1)

将PropTest属性中的值赋值委托给TextBox:

public string PropTest
{
    get { return txtExpected.Text; }
    set { txtExpected.Text = value; }
} 

答案 5 :(得分:-1)

您似乎没有在PropTest的setter中执行任何操作。它不会在构造之前设置,所以当你这样做时它将为null:

txtExpected.Text = PropTest;

在构造函数中。如果你这样做:

public string PropTest
{
    get { return _PropTest; }
    set 
    { 
        _PropTest = value; 
        txtExpected.Text = PropTest;
    }
} 

它应该工作。这不是我称之为“理想”的做事方式,你可能想看看Dependency PropertiesINotifyPropertyChangedBinding