4

MainWindowというウィンドウにDataGridコントロールがあります。MainWindowから、ボタンクリックで次のコードを使用してNewCustomerWindowという別のウィンドウを開きます。

NewCustomerWindow newCustomerWindow = new NewCustomerWindow();
newCustomerWindow.ShowDialog();

NewCustomerWindowには、誰かが顧客に関する情報を入力できるテキストボックスを備えたフォームがあり、これらの情報はデータベースに保存されます。これらの情報を保存した後、メインウィンドウのDataGridを更新したいので、次のコードを使用します

var mainWindow = Application.Current.Windows
                .OfType<MainWindow>()
                .FirstOrDefault(window => window is MainWindow);

mainWindow.customersGrid.Items.Add(new 
            {
                CustomerID = txtCustomerID.Text,
                CompanyName = txtCompanyName.Text,
                ContactName = txtContactName.Text,
                ContactTitle = txtContactTitle.Text,
                Address = txtAddress.Text,
                City = txtCity.Text,
                Region = txtRegion.Text,
                PostalCode = txtPostalCode.Text,
                Country = txtCountry.Text,
                Phone = txtPhone.Text,
                Fax = txtFax.Text
            });

上記のコードは、次のエラーを返します。「ItemsSourceの使用中は操作が無効です。代わりにItemsControl.ItemsSourceを使用して要素にアクセスして変更してください。」

CustomersGridはMainWindowのDataGridの名前であり、その構造は次のとおりです。

<DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="8,29,8,8" Name="customersGrid" VerticalAlignment="Stretch" Loaded="customersGrid_Loaded">
        <DataGrid.Columns>
            <DataGridTextColumn Width="Auto" Binding="{Binding CustomerID}" Header="Κωδικός Πελάτη"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding CompanyName}" Header="Όνομα Εταιρίας"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding ContactName}" Header="Όνομα Επαφής"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding ContactTitle}" Header="Τίτλος Επαφής"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Address}" Header="Διεύθυνση"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding City}" Header="Πόλη"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Region}" Header="Περιοχή"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding PostalCode}" Header="Ταχυδρομικός Κώδικας"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Country}" Header="Χώρα"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Phone}" Header="Τηλέφωνο"/>
            <DataGridTextColumn Width="Auto" Binding="{Binding Fax}" Header="Fax"/>
        </DataGrid.Columns>
    </DataGrid>

解決策は、DataGridのItemsSourceプロパティをすべてのデータで再度設定することだと思いますが、顧客のデータは多くのレコードをもたらすwcfサービスからのものであるため、これは適切な選択ではありません。それで、この問題の良い解決策は何ですか?前もって感謝します。

4

1 に答える 1

2

あなたはあなたを設定しますMainWindow.DataContext = MainViewModel.Instance (それをシングルトンにするかどうかのあなたの選択)

MainViewModelクラスにはobservableCollection依存関係プロパティが必要であり、Customersと呼ぶことができます。DataGridを顧客にバインドします

<DataGrid ItemsSource="{Binding Customers}" />

したがって、データグリッドを更新する場合は、顧客を更新するだけで(たとえば、NewCustomerWindowから)、データグリッドが自動的に更新されます。

ここに良い例があります:

A-Practical-Quick-start-Tutorial-on-MVVM-in-WPF

DataGridチュートリアル

于 2013-01-07T13:18:15.640 に答える