我在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值?
答案 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。