如何读取WPF UserControl中传递的参数?

时间:2009-02-03 16:28:12

标签: wpf user-controls

我在WPF中创建了一个用户控件:

<UserControl x:Class="TestUserControl.Controls.GetLatest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <TextBlock Name="theTextBlock"/>
</UserControl>

后面的代码有一个名为“FirstMessage”的参数,它将其设置为我的用户控件TextBlock的文本:

public partial class GetLatest : UserControl
{
    public string FirstMessage { get; set; }

    public GetLatest()
    {
        InitializeComponent();
        theTextBlock.Text = this.FirstMessage;
    }
}

在我的主代码中,我可以使用intellisense在我的用户控件中设置FirstMessage参数:

<Window x:Class="TestUserControl.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    xmlns:controls="clr-namespace:TestUserControl.Controls"
    >
    <StackPanel>
        <controls:GetLatest FirstMessage="This is the title"/>
    </StackPanel>
</Window>

但是,它仍然没有设置文本。我已经尝试了Text =“{Binding Path = FirstMessage}”以及我找到的其他语法,但没有任何效果。

如何在用户控件中访问FirstMessage值?

5 个答案:

答案 0 :(得分:15)

您的绑定方法不起作用,因为您的属性FirstMessage在更新时不会通知。使用依赖属性。见下文:

public partial class GetLatest : UserControl
{
    public static readonly DependencyProperty FirstMessageProperty = DependencyProperty.Register("FirstMessage", typeof(string), typeof(GetLatest));

    public string FirstMessage
    {
        get { return (string)GetValue(FirstMessageProperty); }
        set { SetValue(FirstMessageProperty, value); }
    }

    public GetLatest()
    {
        InitializeComponent();
        this.DataContext = this;
    }

}

XAML:

<UserControl x:Class="TestUserControl.Controls.GetLatest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock Text="{Binding FirstMessage}" />
</UserControl>

每当FirstMessage属性发生更改时,您的文本块都会自行更新。

答案 1 :(得分:3)

在调用构造函数后设置FirstMessage。 您应该从FirstMessage的setter中更改Text。

从XAML初始化对象时,首先调用默认构造函数,然后在对象上设置属性。

答案 2 :(得分:2)

这个快速示例不会使用任何绑定,因为直到调用默认构造函数之后才设置该值,但是这里是如何显示文本的。

<UserControl x:Class="TestUserControl.Controls.GetLatest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="GetLatest_Loaded">
        <TextBlock Name="theTextBlock"/>
</UserControl>

然后,只需将您的cs文件修改为:

public partial class GetLatest : UserControl
{
    public string FirstMessage { get; set; }

    public GetLatest()
    {
        InitializeComponent();
        theTextBlock.Text = this.FirstMessage;
    }

    private void GetLatest_Loaded(object sender, RoutedEventArgs e)
    {
        theTextBlock.Text = this.FirstMessage;
    }
}

我建议改为设置一个Binding,因为这是一个类似意大利面条的代码。

答案 3 :(得分:1)

您也可以使用:

public partial class GetLatest : UserControl
{
    private string _firstMessage;
    public string FirstMessage 
    {
        get { return _firstMessage; }
        set { _firstMessage = value; theTextBlock.Text = value; }
    }

    public GetLatest()
    {
        InitializeComponent();
    }
}

答案 4 :(得分:0)

如果您在上面发布的代码是一个时间问题;在构造函数执行时,FirstMessage属性没有赋值。您必须在稍后发生的事件中执行该代码,例如Loaded。