如何防止子/从gridview上的验证错误停止应用程序

时间:2013-01-02 18:25:35

标签: wpf xaml wpfdatagrid

我有主从DataGrid,主人包含不同的客户对象。在主服务器中选择特定客户时,子服务员会显示该客户的订单。 (每个客户都有ObservableCollection<order>订单属性。订单有交货地址和数量。我使用以下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>

交货日期和数量是可编辑的。我添加了一个自定义验证规则,确保数量解析为正双精度,否则会导致验证错误。 enter image description here

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

当主服务器为ComboBox时,其他情况下也会发生错误。然而,奇怪的是,当孩子是一个简单的TextBox时,它不会发生。

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

编辑:我的班级订单实施如下:

class Order
{

    public string deliveryAddress
    {
        get;
        set;
    }

    public double quantity
    {
        get;
        set;
    }

    public Order()
    {

    }
}

客户是ObservableCollection<customer>,每个客户都包含类型的属性订单 ObservableCollection<Order>

1 个答案:

答案 0 :(得分: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>

最好为视图模型上的所选项目提供一个属性,而不是使用元素名称绑定,但测试是可以的。