我最近从Windows Forms迁移到了WPF。我从Reed Copsey的系列节目“Better User and Developer Experiences – From Windows Forms to WPF with MVVM”开始。在4th part of the series上,以下代码应填充包含数据的文本框:
<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
文字实际上为空!
所以,我检查了what triggers source updates,并决定将绑定模式更改为TwoWay
,但我得到了相同的结果!
最后,我发现"How to: Control When the TextBox Text Updates the Source"显示了如何做到这一点。根据{{3}}在他的系列文章中所说的内容:
代码越少意味着维护越少,测试越少,担心越少。
并根据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}"/>
我将输入(大致)相同数量的代码。这样的任务(通过TextBox更改TextBlock)可以使用普通事件处理程序完成。所以我的问题是:
任何帮助将不胜感激, 提前谢谢。
答案 0 :(得分:1)
首次尝试不正确,因为Binding
路径相对于DataContext
的{{1}}。您正在尝试绑定到特定元素,因此您可以使用TextBlock
指定源,然后路径相对于此:
ElementName
WPF的惯用方法是使用MVVM。在这种情况下,Text="{Binding ElementName=TextBox1, Path=Text}"
和TextBox
都将绑定到视图模型上的属性。
更改TextBlock
中的文字会更新此属性,而后者会更新TextBox
。您的视图模型不受WPF View关注,可以在不涉及WPF的情况下进行单元测试。