0

我有 master-slave DataGrid,而 master 包含不同的客户对象。当在主中选择特定客户时,子显示该客户的订单。(每个客户都有一个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>

交货日期和数量是可编辑的。我添加了一个自定义验证规则,以确保数量解析为正数,否则会导致验证错误。在此处输入图像描述

这可行,但是当我选择另一个客户 (Robert) 而当前客户 (Mark) 的订单中仍然存在验证错误,然后再次选择输入错误的客户 (Mark) 时,应用程序将停止工作。(弹出说明:[应用程序名称]已停止工作)。

当 master 为ComboBox. 然而,奇怪的是,当孩子是一个简单的 时,它不会发生TextBox

无论如何,我试图想出解决这个问题的解决方案,但到目前为止我还没有想出一些像样的东西。什么是好的选择?

编辑:我的班级订单执行如下:

class Order
{

    public string deliveryAddress
    {
        get;
        set;
    }

    public double quantity
    {
        get;
        set;
    }

    public Order()
    {

    }
}

客户是一个ObservableCollection<customer>,并且每个客户都包含一个订单类型的属性 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 回答