0

私は Windows Phone の開発は初めてで、現在は単純なフォームを使用しています。MVVM パターンと MvvmLight を使用してコマンドを実行しています。「申請者」エンティティは常に空で、双方向のデータバインディングが機能していないようです。これが私のコードです。誰かが私を正しい方向に向けてくれることを願っています。

意見

   <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;
    }

ビュー モデル(ビュー モデルは、INotifyPropertyChanged を実装する ViewModelBase から継承されます)

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 が null であるため、常にエラー メッセージが表示されます。

** * **更新* ** * ** * **

モデルの Forename プロパティは次のとおりです。

[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");
        }
    }
4

1 に答える 1

2

ApplicantViewModel には Forename プロパティがありません。申請者のみが持っています。したがって、次のようにします。

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

他のテキスト ボックスでも同じことを行います。

于 2012-09-19T12:22:47.623 に答える