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

8

我在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;
    }
}

在我的主代码中,我可以通过智能感知设置用户控件中的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个回答

17

你的绑定方法不起作用是因为你的属性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属性更改时,您的文本块将自动更新。


我尝试了你提供的解决方案,但是遇到了错误“在遍历树时超过了逻辑树深度。这可能表示树中存在循环。” 但是当我删除此.DataContext = this; 这行代码时,错误消失了,但是绑定将无法工作。这里的问题是什么? - Tri Q Tran
@Tri Q:我也遇到了逻辑树深度异常,但是出现在不同的代码中。网上关于这个错误的资料似乎不多,所以如果你找到了解决方案,能否回复一下? - jpierson
如果你想使用DataGrid并设置它的DataContext和ItemsSource属性,那么你的示例应该如何翻译呢?例如: - Chad

3

构造函数被调用后,会设置FirstMessage。你应该从FirstMessage的setter中改变你的文本。

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


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)来代替这段代码,因为这种写法有点像意大利面条一样混乱。

1

你也可以使用:

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

    public GetLatest()
    {
        InitializeComponent();
    }
}

0
在您发表的代码中,这是一个时间问题;当构造函数执行时,FirstMessage属性尚未被分配其值。 您必须在稍后发生的事件(如Loaded)中执行该代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接