我做错了什么,所以数据绑定目标不会受到数据绑定源的影响

本文关键字:数据绑定 影响 目标 什么 错了 | 更新日期: 2023-09-27 17:56:01

我最近从Windows Forms迁移到WPF。我从 Reed Copsey 的系列文章"更好的用户和开发人员体验——从 Windows 窗体到 WPF with MVVM"开始。在本系列的第 4 部分中,以下代码应用数据填充文本框:

<TextBox Grid.Row="0" Grid.Column="1" Text="{Binding Path=Feed.Title, Mode=OneWay}" />
<TextBox Grid.Row="1" Grid.Column="1" Text="{Binding Path=Feed.Link.AbsoluteUri, Mode=OneWay}" />
<TextBox Grid.Row="2" Grid.Column="1" Text="{Binding Path=Feed.Description, Mode=OneWay}"/>

我尝试使用此代码模板来"将目标(TextBlock.Text)更新为源(TextBox.Text)更新",这就是我的完整XAML代码:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="608.134" Width="768.284">
    <Grid>
        <Button Content="Button" HorizontalAlignment="Left" Height="28" Margin="442,56,0,0" VerticalAlignment="Top" Width="139" Click="Button_Click_1"/>
        <TextBox x:Name="TextBox1" HorizontalAlignment="Left" Height="28" Margin="56,56,0,0" TextWrapping="Wrap" Text="TextBox1" VerticalAlignment="Top" Width="237"/>
        <TextBlock HorizontalAlignment="Left" Height="66" Margin="56,168,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="285"
                   Text="{Binding Path=TextBox1.Text, Mode = OneWay}"/>
    </Grid>
</Window>

TextBlock文本的预期值是 "TextBox1"TextBox1.Text ),但TextBlock文本实际上是空的!

因此,我检查了触发源更新的内容,并决定将绑定模式更改为TwoWay,但我得到了相同的结果!

最后,我找到了"如何:控制文本框文本何时更新源",展示了如何做到这一点。根据里德·科普西(Reed Copsey)在他的系列的这一部分中所说的话:

更少的

代码意味着更少的维护、更少的测试、更少的担忧。

根据MSDN上找到的消息来源:

    <Label>Enter a Name:</Label>
<TextBox>
  <TextBox.Text>
    <Binding Source="{StaticResource myDataSource}" Path="Name"
             UpdateSourceTrigger="PropertyChanged"/>
  </TextBox.Text>
</TextBox>
<Label>The name you entered:</Label>
<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=Name}"/>

我将输入(大致)相同数量的代码。这样的任务(逐个文本框更改)可以使用普通事件处理程序来完成。所以我的问题是:

  1. 如果相同的任务可以用大致相同的代码完成,那么是什么让 WPF 数据绑定如此特别?
  2. 我的第一个代码出了什么问题?
  3. 在上面的 MSDN 代码中,他们必须为源和目标键入 XAML 代码。如果我希望源是类中的值,是否有可能完成这样的任务?又如何?

任何帮助将不胜感激,提前谢谢。

我做错了什么,所以数据绑定目标不会受到数据绑定源的影响

第一次尝试不正确,因为Binding路径相对于TextBlockDataContext。 您正在尝试绑定到特定元素,因此您可以使用 ElementName 指定源,然后路径相对于此元素:

Text="{Binding ElementName=TextBox1, Path=Text}"

WPF 的惯用方法是使用 MVVM。 在这种情况下,TextBoxTextBlock都将绑定到视图模型上的属性。

更改TextBox中的文本将更新此属性,进而更新TextBlock。 视图模型不受 WPF 视图问题的影响,可以在不涉及 WPF 的情况下进行单元测试。