我有一个带有文本块和按钮的简单页面。我想在按下按钮时更改文本。但是使用页面的Data.Name属性中的文本。
我知道我可以更简单(仅使用Name而不是Data.Name),但是我需要Data.Name,不要问为什么。
为此,我有一个DataType类,该类具有Name属性和名为该类Data的对象。我想在此页中放入数据,然后将文本绑定到Data.Name属性。
当我单击按钮时,什么也没发生,问题是我该如何使它工作?
XAML :
-jar
类数据类型
<Page
x:Class="App1.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:App1"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="auto" />
</Grid.RowDefinitions>
<TextBlock Grid.Row="0" Text="{Binding Data.Name, Mode=OneWay}"/>
<Button Grid.Row="1" Content="Change" Click="Button_Click"/>
</Grid>
</Page>
类主页
public ref class DataType: public INotifyPropertyChanged {
public:
property String^ Name
{
String^ get() {
return m_Name;
}
void set(String^ value) {
m_Name = value;
OnPropertyChanged("Name");
}
}
virtual event PropertyChangedEventHandler^ PropertyChanged;
private:
void OnPropertyChanged(Platform::String^ propertyName)
{
PropertyChanged(this, ref new PropertyChangedEventArgs(propertyName));
}
String^ m_Name;
};
答案 0 :(得分:2)
在UWP中,有x:Bind和Binding标记扩展,使用时它们有一些区别。您可以从上面两个链接的文档中了解详细信息。
现在,我们将讨论导致上述问题的原因。
在您的xaml中,您使用Binding标记扩展来绑定属性路径,因为Binding使用 DataContext 作为默认源。简而言之,当您使用Binding属性路径时,您将绑定DataContext.Property路径,您只需要使用Bind源对象的属性,而无需在xaml上指定Source数据对象。作为Traversing an object graph的介绍:
"{Binding Path=Customer.Address.StreetAddress1}"
这是评估此路径的方式:
将在数据上下文对象(或由同一绑定指定的Source)中搜索名为属性“客户”的。
在作为“客户”属性值的对象中搜索名为“地址”的属性。
在作为“地址”(Address)属性值的对象中搜索名为“ StreetAddress1”的属性。
有关详细信息,请参见Property-path syntax。
因此,您的代码仅需绑定Name
属性并设置DataContext
就可以工作。 (请注意:您的MainPage类不需要实现INotifyPropertyChanged
接口。)
<TextBlock Grid.Row="0" Text="{Binding Name, Mode=OneWay}"/
和
this->DataContext = Data;
还请注意:如果您使用的是Visual C ++组件扩展(C ++ / CX),则由于我们将使用{Binding},因此需要将BindableAttribute属性添加到{{1 }}类。
DataType
另一方面,您可以使用x:Bind代替Binding,因为x:Bind不会将 DataContext 用作默认来源,而是使用页面或用户控件本身。因此,它将在页面或用户控件的代码背后查找属性,字段和方法。要将视图模型公开给{x:Bind},通常需要向页面或用户控件后面的代码中添加新字段或属性。例如:在页面中, Text =“ {x:Bind Employee.FirstName}” 将在页面上寻找 Employee成员,然后是 FirstName < / strong>成员,由雇员返回。
答案 1 :(得分:0)
问题是XAML中看不到DataType属性,因为“ pch.h”中不包含“ DataType.h”
一旦将其包含在预编译的头文件中,一切正常。
BTW,看来Binding并未检查XAML或其他类型的类型可见性,而x:Bind则进行检查。使用x:Bind,编译器会抱怨未知的Data.Name,这使我得以找出问题所在。