不明白为什么他不显示在TextBlock
用户.cs:
class User
{
public string name { get; set; } = "IVAN";
public string surname { get; set; } = "IVANOV";
}
主窗口.xaml:
<StackPanel Orientation="Vertical" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBox Width="130" Height="30"/>
<TextBox Width="130" Height="30" Margin="0,10,0,0"/>
</StackPanel>
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Right" Background="Black" Width="130" Margin="10">
<TextBlock Text="{Binding name}" Foreground="White"/>
<TextBlock Text="{Binding surname}" Margin="0,10,0,0" Foreground="White"/>
</StackPanel>
<Button Width="130" Height="30" HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="10" Content="REFRESH" Click="Button_Click"/>
主窗口.cs:
private User user { get; set; }
public MainWindow()
{
InitializeComponent();
//user = DataContext as User;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
DataContext = user;
}
更新:决定让它变得更难。现在我们需要将数据从TextBox
推送到User
。但是显然没用,pass null
inuser
主窗口.cs:
private void Button_Click(object sender, RoutedEventArgs e)
{
user = DataContext as User;
DataContext = user;
}
对于数据绑定,需要了解一件事。如果在使用事件处理程序和直接访问控件时,您从代码中分配控件属性的值,那么对于绑定,情况恰恰相反,控件本身从绑定属性中获取值并将更改后的值放在那里如果它被修改。从代码中,您只需使用此属性。
任务
DataContext
看起来像这样。班级User
必须是public
.DataContext
通常在窗口的构造函数或事件处理程序中分配Window.Loaded
。第二种更可取。当 时
DataContext
,内部的 View 自身引发事件DataContextChanged
并更新所有控件的内容。但这只会工作一次。如果你不修改任何东西,那么只有单向绑定 View-> ViewModel 会起作用。也就是说,当手动更改文本框的值时,viewmodel 属性的值会发生变化。同时,数据绑定的行为在这里很重要,默认情况下,当文本框失去焦点时,更改的事实就会发生,例如,当您单击按钮时,它会自动发生。
尝试更改文本框中的内容,然后单击带有此代码的按钮。
您将看到对文本框所做的更改。
但实际上,数据绑定可以是双向的。您还可以将多个控件绑定到同一个属性。
双向绑定是使用
INotifyPropertyChanged
视图模型的接口实现的。为此,有一个已经编写好的模板小工具——这个接口的实现。只需将此类插入到项目中,然后在viewmodel 中继承它即可。(让我们将公共属性大写,这是 C# 中的惯例)
现在您可以在代码中执行此操作
并且它会在界面中立即发生变化。
制作 2 个控件以了解其工作原理。
尝试更改文本框和代码中的值。
尝试像这样更改绑定行为。
看看有什么变化。
主窗口.cs: