我有Page
我要在string
中显示Label
属性。
这是我的代码,但标签中不会出现任何内容。
这是我的.xaml
<Page x:Class="MyProject.PageOne"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300"
Title="PageOne"
Name="pageOne>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>
<Label Grid.Column="0" Content="{Binding ElementName=pageOne, Path=aStr}" FontWeight="Normal" FontSize="43" HorizontalAlignment="Left" Margin="0,00,0,0" VerticalAlignment="Center" Foreground="White"/>
</Grid>
</Page>
这是我的.cs
代码
public partial class PageOne: Page, IPageInterface
{
public String aStr{get;set;}
public PageOne()
{
InitializeComponent();
}
public void Start()
{
aStr = "Test";
}
}
答案 0 :(得分:0)
就您所描述的问题而言,您发布的代码唯一真正错误的是您尚未实现某些方式来发生属性更改通知。因为aStr
属性在最初设置Label
内容之后才设置为新值,而没有办法接收通知,因此框架无法知道它需要更新Label
1}}内容。
在WPF中,通常完成的两种主要方式(实际上,AFAIK只有两种完全支持的方式)是创建DependencyProperty
个实例,或实现INotifyPropertyChanged
。要么工作正常。
以下是您的代码应如何实现INotifyPropertyChanged
的示例:
public partial class PageOne : Page, IPageInterface, INotifyPropertyChanged
{
private string _astr;
public String aStr
{
get { return _astr; }
set { _astr = value; OnPropertyChanged(); }
}
public Page1()
{
InitializeComponent();
}
public void Start()
{
aStr = "Test";
}
private void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
实现界面需要几个简单的步骤:
PropertyChanged
请注意,要执行此操作,您无法使用自动实现的属性。您需要自己实现每个属性,使用支持字段,并调用将引发属性的方法。
.NET提供了方便的[CallerMemberName]
属性,我在这里展示了它。因此,在aStr
属性的setter方法中,在设置了支持字段的值之后,只需调用不带任何参数的方法,运行时会自动为您填写正确的属性名称。
现在,您发布的代码在XAML中也存在其他一些问题。首先它不会编译,因为你遗漏了一个"
字符,并且因为你有一个额外的</Grid>
结束标记。
另一个可能的问题,虽然由于我们错过了显示此Page
对象的完整上下文而无法确切知道,但文本的颜色是白色的。如果您将Label
实例放在白色背景上,那么当然即使设置正确,您也无法看到该文字。
我注意到评论者Franck建议您设置DataContext
。事实是,鉴于您发布的代码实际上没有必要,这样做实际上并不能解决您遇到的问题。
但是如果您确实修复了基础通知问题,那么他的建议是替代方式,您可以实现绑定。通过将DataContext
设置为包含属性的对象(此处为您的PageOne
类),然后在绑定时,您可以单独指定属性名称,而无需包含ElementName
根本不需要使用Path=
和属性名称。你可能会发现这种技术更方便,至少在某些时候。
将来,请花时间提供可靠地再现问题的a good, minimal, complete code example。您更有可能以这种方式得到答案,并且您将确保您获得的任何答案都尽可能好。