0

私は WPF を使用してアプリケーションを作成し、組織がさまざまなデータをアプリケーションに入力できるようにしています。これを行うためのタブ コントロールがあります。

次に、別のビューで、ユーザーがデータベースに挿入したデータを示す一連の異なるデータ グリッドを表示します。必要なデータを追加、更新、または削除するためのボタンが含まれています。

それが私の質問につながります。現在、問題なく簡単にデータを削除および追加できます。しかし、アイテムを更新しようとすると問題がselected発生しますが、更新されず、null reference exception.

ただし、プロパティ属性をプログラムで設定すると、正常に更新されます。そのようです; public int _OrganisationTypeDetailID = 17; public int _OrganisationTypeID = 1;しかし、ユーザーが自分で選択して必要なデータを更新できるようにしたいので、これは望ましくありません。

私の問題の解決に役立つ可能性のあるコードの一部を次に示します。

モデルを見る;

    public void UpdateOrganisationTypeDetail(OrganisationTypeDetail orgTypeDetail)
    {
        using (DBEntities context = new DBEntities())
        {
            var orgTD = context.OrganisationTypeDetails.Where(otd => otd.OrganisationTypeDetailID == SelectedType.OrganisationTypeDetailID).FirstOrDefault();

            if (orgTD != null)
            {
                orgTD.Title = Title;
                orgTD.FirstName = FirstName;
                orgTD.Surname = Surname;
                orgTD.Position = Position;
                orgTD.DateOfBirth = DateOfBirth;
                orgTD.Address = Address;
                orgTD.Country = Country;
                orgTD.Postcode = Postcode;
                orgTD.PhoneNumber = PhoneNumber;
                orgTD.MobileNumber = MobileNumber;
                orgTD.FaxNumber = FaxNumber;
                orgTD.Email = Email;
                orgTD.NINumber = NINumber;

                //context.OrganisationTypeDetails.Attach(orgTD);
                context.OrganisationTypeDetails.ApplyCurrentValues(orgTD);
                context.SaveChanges();

                MessageBox.Show("Updated Organisation Type Details");
            }
            else
            {
                MessageBox.Show("Unable to update selected 'Type'.");
            }
        }

    private OrganisationTypeDetail _SelectedType;
    public OrganisationTypeDetail SelectedType
    {
        get
        {
            return _SelectedType;
        }
        set
        {
            if (_SelectedType == value)
                return;

            _SelectedType = value;
            OnPropertyChanged("SelectedType");
        }
    }

    public List<OrganisationTypeDetail> GetOrganisationTypeDetail //Loads data 
    {
        get
        {
            using (DBEntities context = new DBEntities())
            {
                var query = from e in context.OrganisationTypeDetails
                            select e;
                return query.ToList<OrganisationTypeDetail>();
            }
        }
    }

    private ICommand showUpdateCommand;
    public ICommand ShowUpdateCommand //Update command
    {
        get
        {
            if (showUpdateCommand == null)
            {
                showUpdateCommand = new RelayCommand(this.UpdateFormExecute, this.UpdateFormCanExecute); //i => this.UpdateOrganisationTypeDetail()
            }
            return showUpdateCommand;
        }
    }

コードビハインド;

    private void btnUpdateOrgTypeDetail_Click(object sender, RoutedEventArgs e)
    {
        OrganisationTypeDetail selected = dgOrgTypeDetail.SelectedItem as OrganisationTypeDetail;
        OrganisationTypeDetailViewModel org = new OrganisationTypeDetailViewModel();

        if (selected == null)
            MessageBox.Show("You must select a 'Type' before updating.");
        else
        {
            OrganisationTypeDetailUpdateView update = new OrganisationTypeDetailUpdateView();

            update.ShowDialog();
            org.UpdateOrganisationTypeDetail(selected);
            Page_Loaded(null, null);
        }
    }

xaml;

            <DataGrid Name="dgOrgTypeDetail" Height="145" Width="555" 
            IsSynchronizedWithCurrentItem="True"
            ItemsSource="{Binding GetOrganisationTypeDetail}"
            SelectedItem="{Binding SelectedType, Mode=TwoWay}">

この問題が解決されることを願っています。

4

1 に答える 1

0

これに対するあなたの最善の策は、MVVMパターンでコマンドを使用してこれを達成することだと思います..MVVMとコードビハインドの組み合わせを使用しているようで、クリックイベント時にビューモデルの新しいインスタンスを実際に作成しているようです発火します。ビューのコード ビハインドでビュー モデルをデータ コンテキストとして一度ビューにバインドしてから、選択した型を更新してみてください。

また、SelectedType で更新を実行しようとしている場合は、 Snoopを使用してビューを見てください 。SelectedType プロパティがまだビューにバインドされているかどうかを確認してください。

ICommand UpdateOrgTypeDetail { get;} 

次に、ビューモデルコンストラクターで新しいインスタンスを宣言します

UpdateOrgTypeDetail = new DelegateCommand<object>(ExecuteUpdateOrgTypeDetail,    CanExecuteUpdateOrgTypeDetail);

これら 2 つのデリゲートにより、ボタンをクリックできるようになります (UpdateOrgTypeDetail にバインドする必要があります)。

<Button Command="{Binding UpdateOrgTypeDetail}" />

ここから、プロパティの更新が正しく行われていることがわかるはずです。

于 2012-12-05T13:02:46.677 に答える