2015-06-14 45 views
1

我最近从Windows窗体移到了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"显示如何做到这一点。根据什么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}"/> 

我将打字(大致)相同的代码量。这样的任务(通过TextBox更改来更改TextBlock)可以使用常规事件处理程序完成。所以我的问题是:

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

任何帮助将不胜感激, 在此先感谢。

回答

1

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

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

的惯用做法是WPF使用MVVM。在这种情况下,TextBoxTextBlock将被绑定到View Model上的属性。

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

+0

简洁地说,谢谢! –