0

マスターとスレーブDataGridがあり、マスターにはさまざまな顧客オブジェクトが含まれています。マスターで特定の顧客が選択されると、その顧客による注文が子に表示されます。(各顧客にはObservableCollection<order>orders プロパティがあります。注文には配送先住所と数量があります。私は次の XML を使用します

<StackPanel DataContext="{StaticResource Customers1}" Orientation="Horizontal">
    <DataGrid ItemsSource="{Binding}" AutoGenerateColumns="False" 
   IsSynchronizedWithCurrentItem="True">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
        </DataGrid.Columns>
    </DataGrid>
    <DataGrid ItemsSource="{Binding /orders}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Delivery Adress">
                <DataGridTextColumn.Binding>
                    <Binding Path="deliveryAddress"></Binding>
                </DataGridTextColumn.Binding>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Quantity">
                <DataGridTextColumn.Binding>
                    <Binding Path="quantity">
                        <Binding.ValidationRules>
           <local:PositiveDoubleValidationRule></local:PositiveDoubleValidationRule>
                        </Binding.ValidationRules>
                    </Binding>
                </DataGridTextColumn.Binding>
            </DataGridTextColumn>
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>

配達日と数量は編集可能です。数量が正の double に解析され、それ以外の場合は検証エラーが発生することを保証するカスタム検証ルールを追加しました。ここに画像の説明を入力

これは機能しますが、現在の顧客 (Mark) の注文にまだ検証エラーがある間に別の顧客 (Robert) を選択し、間違った入力を持つ顧客 (Mark) を再度選択すると、アプリケーションは動作を停止します。(ポップアップ表示: [アプリケーション名] が動作を停止しました)。

マスターがComboBox. しかし、不思議なことに、子が単純な の場合は発生しませんTextBox

とにかく、これを修正する解決策を考え出そうとしましたが、これまでのところ、まともなものを思い付くことができませんでした. 良い選択肢は何ですか?

編集:私のクラスの注文は次のように実装されています:

class Order
{

    public string deliveryAddress
    {
        get;
        set;
    }

    public double quantity
    {
        get;
        set;
    }

    public Order()
    {

    }
}

Customers は でありObservableCollection<customer>、各 customer にはタイプ のプロパティ orders が含まれています ObservableCollection<Order>

4

1 に答える 1

0

役立つ可能性はわずかですが、コレクションの同期を使用する代わりに、選択したアイテムに直接バインドしてみてください。何かのようなもの:

<StackPanel DataContext="{StaticResource Customers1}" Orientation="Horizontal">
    <DataGrid x:Name="MasterGrid" ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Name" Binding="{Binding Path=Name}"/>
        </DataGrid.Columns>
    </DataGrid>
    <DataGrid ItemsSource="{Binding SelectedItem.orders, ElementName=MasterGrid}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Delivery Adress">
                <DataGridTextColumn.Binding>
                    <Binding Path="deliveryAddress"></Binding>
                </DataGridTextColumn.Binding>
            </DataGridTextColumn>
            <DataGridTextColumn Header="Quantity">
                <DataGridTextColumn.Binding>
                    <Binding Path="quantity">
                        <Binding.ValidationRules>
                           <local:PositiveDoubleValidationRule></local:PositiveDoubleValidationRule>
                        </Binding.ValidationRules>
                    </Binding>
                </DataGridTextColumn.Binding>
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

要素名でバインドするよりも、ビューモデルで選択したアイテムのプロパティを設定する方が適切ですが、テストには問題ありません。

于 2013-01-10T09:06:54.487 に答える