我一直在关注一些培训视频并使用UWP和C#创建一个简单的应用程序,并使用UWP数据绑定,不幸的是,将数据从文本框传递到类属性不起作用。什么都没发生。没有数据传递,也没有生成错误。
所以我的班级(一切都被剥离到相关代码)是
public class ChangeCalc
{
public string GoodsCost { get; set; }
public string Amountpaid { get; set; }
页面下是
<Page.DataContext>
<local:ChangeCalc />
</Page.DataContext>
在我的2个TextBoxes下我有
<TextBox
x:FieldModifier="public"
Text="{Binding Amountpaid, Mode=TwoWay}"
TextWrapping="Wrap" />
所以它就在那里。
如果我只是在代码隐藏中的按钮Click事件下调用它就可以了。数据传递,代码运行。
myChangeCalc.GoodsCost = txtCost.Text;
myChangeCalc.Amountpaid = txtPaid.Text;
数据绑定何时启动?什么事件(如果有的话)丢失了?
感谢您的帮助。
答案 0 :(得分:0)
没有任何东西可以通过。但是将click事件发送到相同的属性,它会通过OK。
这是因为当您使用数据绑定时,您只需将数据模型指定为DataContext
,其中可以找到TextBox
的属性,您实际上并未将任何实际数据传递给TextBox
。当您使用按钮单击事件时,您将创建此数据模型的实例“myChangeCalc”,并将实际数据(如“txtPaid.Text”)传递给此实例的属性“Amountpaid”。
silverfighter,你不必实现INotifyPropertyChanged(我知道什么我不能让它工作)说明说:当TextBox失去焦点时,TextBox.Text的更改被发送到双向绑定源,而不是每次用户按键后。
是的,但是此更改是从绑定目标到绑定源,如果要在此处从绑定源更改为绑定目标,则必须在源对象上实现INotifyPropertyChanged
接口,以便源可以通过绑定引擎侦听的事件。
所以,举个例子:
<Page.Resources>
<local:ChangeCals x:Name="ccData" Amountpaid="111" />
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" DataContext="{StaticResource ccData}">
<TextBox
x:FieldModifier="public"
Text="{Binding Amountpaid, Mode=TwoWay}"
TextWrapping="Wrap" Height="50" />
</Grid>
您可以在页面资源中创建数据模型的实例,并将此资源设置为Binding的DataContext
。
另一个例子:
<TextBox
x:FieldModifier="public"
Text="{Binding Amountpaid, Mode=TwoWay}"
TextWrapping="Wrap" />
代码背后的代码:
public MainPage()
{
this.InitializeComponent();
this.DataContext = myChangeCalc;
}
public ChangeCals myChangeCalc = new ChangeCals { Amountpaid = "111", GoodsCost = "222" };
任何方式,绑定源都应该是数据模型的一个实例(ChangeCals类)。由于您在此处使用了{Binding},因此我没有显示使用{x:Bind}的示例,如果您想了解有关{x:Bind}的更多信息,可以参考{x:Bind} markup extension。有关绑定和x:Bind的更多信息,请参阅Data binding in depth。