2014-09-12 67 views
0

我希望有人能给我一个正确的方向踢,我目前正在学习WPF和MVVM - 让我们说它不是一帆风顺。基本上我试图访问DataContext的属性,并将它们绑定到我的视图中的属性。我会完全诚实的,我陷入了一阵纠结。访问视图中的DataContext属性

当用户点击相关按钮时,它会触发下面的代码。

private void OnReceiptClick(object sender, RoutedEventArgs e) 
    { 
     var dialogBox = new DisplayReceiptView(((CheckMemberViewModel) this.DataContext).ReceiptViewModel); 
     dialogBox.ShowDialog(); 
    } 

我CheckMemberViewModel目前持有的“人”属性我之后,在这个阶段的DataContext如预期的那样填充。

我DisplayReceiptView背后的代码如下所示:

public DisplayReceiptView(ReceiptViewModel context) : this() 
    { 
     this.DataContext = context; 
    } 

再次一切似乎是正确的,最后在我的XAML我有

<Grid DataContext="{Binding Path=Person}"> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition Width="10"/> 
      <ColumnDefinition Width="150"/> 
      <ColumnDefinition Width="*"/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="10" /> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="Auto"/> 
     </Grid.RowDefinitions> 
     <Label Grid.Column="1" Grid.Row="1">Name:</Label> 
     <TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Path=Person.Forename}"></TextBox> 
     </Grid> 

不幸的是,无论我做什么,而且我认为我现在所处的位置是距离我最近的地方,这些数据似乎并不具有约束力。以下是我的ViewModel代码的属性

 private Person _person; 
     public Person Person 
    { 
     get { return _person; } 
     set 
     { 
      if (value != _person) 
      { 
       _person = value; 
       OnPropertyChanged("Person"); 
      } 
     } 
    } 

任何帮助,非常感谢。

回答

1
<TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Path=Person.Forename}"></TextBox> 

这是错了,因为你已经绑定到人

<TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Forename}"></TextBox> 

是所有你需要

<TextBox Grid.Column="2" Grid.Row="1" Text="{Binding Forename, Mode=TwoWay}"></TextBox> 

将更改保存到源和检索的变化,当然你会需要保存上下文更改以使它们永久保存

+0

同意 - 通常您不绑定到ABCD,其中这些代表属性链和子属性。您将数据源设置为A.B.C,然后绑定到D - 链中的最后一个属性。通知仅限于该财产。 – Dean 2014-09-13 03:01:13