2012-09-19 137 views
0

我是Windows Phone開發新手,目前有一個簡單的表單。我使用MVVM模式和MvvmLight來運行命令。 「申請人」實體總是空的,看起來2路數據綁定不起作用。這是我的代碼,我希望有人能指出我的方向。Windows Phone 7 MVVM數據綁定形式

查看

<Grid x:Name="LayoutRoot" Background="Transparent" DataContext="{Binding Applicant}"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 

    <!--TitlePanel contains the name of the application and page title--> 
    <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 
     <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> 
     <TextBlock x:Name="PageTitle" Text="create account" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> 
    </StackPanel> 

    <!--ContentPanel - place additional content here--> 
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> 
     <StackPanel> 
      <StackPanel> 
       <TextBlock FontSize="15" TextWrapping="Wrap" Margin="0,0,0,10" Text="Please register to create your applicant account. No information will be passed to third parties for any reason."></TextBlock> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="Forename" Width="100"></TextBlock> 
       <TextBox Width="350" BorderBrush="Red" DataContext="{Binding Forename, Mode=TwoWay}"></TextBox> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="Surname" Width="100"></TextBlock> 
       <TextBox Width="350" x:Name="Surname" BorderBrush="Red" DataContext="{Binding Surname, Mode=TwoWay}"></TextBox> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="Email" Width="100"></TextBlock> 
       <TextBox Width="350" x:Name="EmailAddress" BorderBrush="Red" DataContext="{Binding EmailAddress, Mode=TwoWay}"></TextBox> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="Password" Width="100"></TextBlock> 
       <PasswordBox Width="350" x:Name="PassPhrase" BorderBrush="Red" DataContext="{Binding PassPhrase, Mode=TwoWay}"></PasswordBox> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="City" Width="100"></TextBlock> 
       <TextBox Width="350" x:Name="City" DataContext="{Binding City, Mode=TwoWay}"></TextBox> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="State" Width="100"></TextBlock> 
       <TextBox Width="350" x:Name="County" DataContext="{Binding County, Mode=TwoWay}"></TextBox> 
      </StackPanel> 
      <StackPanel Orientation="Horizontal"> 
       <TextBlock VerticalAlignment="Center" Text="Country" Width="100"></TextBlock> 
       <TextBox Width="350" x:Name="Country" DataContext="{Binding Country, Mode=TwoWay}"></TextBox> 
      </StackPanel> 
      <StackPanel> 
       <Button Name="btnContact" 
         Content="Register" 
         DataContext="{Binding ElementName=this, Path=DataContext}" 
         Command="{Binding SaveApplicantCommand}" 
         Width="300"/> 
      </StackPanel> 
     </StackPanel> 
    </Grid> 
</Grid> 

查看代碼後面

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 

     ApplicantViewModel vm = new ApplicantViewModel(); 
     DataContext = vm; 
    } 

視圖模型(視圖模型從ViewModelBase其中實現INotifyPropertyChanged繼承)

public class ApplicantViewModel : ViewModelBase 
{ 
    public ApplicantViewModel() 
    { 
     SaveApplicantCommand = new RelayCommand(SaveApplicant); 
     Applicant = new Applicant(); 
    } 

    public ICommand SaveApplicantCommand {get; set;} 

    void SaveApplicant() 
    { 
     if (string.IsNullOrEmpty(Applicant.Forename)) 
     { 
      MessageBox.Show("Please enter a forename", "Oops...", MessageBoxButton.OK); 
      return; 
     } 

     db.AddObject("Applicants", Applicant); 
     db.BeginSaveChanges(OnChangesSaved, db); 
    } 

    void OnChangesSaved(IAsyncResult result) 
    { 

    } 

    private Applicant _applicant; 
    public Applicant Applicant 
    { 
     get 
     { 
      return _applicant; 
     } 
     set 
     { 
      if (_applicant != value) 
      { 
       _applicant = value; 
       RaisePropertyChanged("Applicant"); 
      } 
     } 
    } 
} 

無論輸入到Forename文本框中,我都會收到錯誤消息,因爲Forename爲空。

** * ** UPDATE * ** * ** * **

下面是該模型中的用的名字屬性

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Services.Design", "1.0.0")] 
    public string Forename 
    { 
     get 
     { 
      return this._Forename; 
     } 
     set 
     { 
      this.OnForenameChanging(value); 
      this._Forename = value; 
      this.OnForenameChanged(); 
      this.OnPropertyChanged("Forename"); 
     } 
    } 
+1

您沒有顯示暴露'Forename'屬性的代碼。如果你將代碼分解到展示問題的最小示例,那將非常有幫助。 – ColinE

回答

2

ApplicantViewModel沒有Forename屬性。只有申請人有。所以做到以下幾點:

<TextBox Width="350" BorderBrush="Red" 
     DataContext="{Binding Applicant.Forename, Mode=TwoWay}"/> 

對其他文本框做相同。

+0

這是必要的,因爲我的LayoutRoot綁定到申請人? – Paul

+0

這是一種向xaml解釋向何處搜索值的方法:) –