2013-01-02 54 views
0

我有主從DataGrid s,並且主站包含不同的客戶對象。當在主人中選擇特定的顧客時,那麼該孩子將顯示該顧客的訂單。 (每個客戶都有一個ObservableCollection<order>訂單屬性。訂單有送貨ADRESS和數量。我用下面的XML如何防止停止應用程序的子/從Gridview驗證錯誤

<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

這樣的工作,但是當我選擇另一個客戶(羅伯特),而當前客戶(馬克)的訂單仍然存在驗證錯誤,然後選擇客戶再次輸入錯誤(標記),應用程序停止工作(彈出窗口:[應用程序名稱]已停止工作)

當主設備爲ComboBox時,該錯誤也會發生在其他情況下。然而,奇怪的是,當孩子是簡單的TextBox時不會發生。

無論如何,我試圖想出解決方案,以解決這個問題,但到目前爲止,我沒有拿出一些體面的東西。什麼是好選擇?

編輯:我的訂單類實現如下:

class Order 
{ 

    public string deliveryAddress 
    { 
     get; 
     set; 
    } 

    public double quantity 
    { 
     get; 
     set; 
    } 

    public Order() 
    { 

    } 
} 

客戶是ObservableCollection<customer>,並且每個客戶包含 ObservableCollection<Order>類型的屬性訂單。

+0

我試圖重現這一點,但它似乎在我的例子中工作。當使用驗證錯誤切換回客戶時,非法輸入已被替換爲原始值。 –

+0

@PeterHansen這很奇怪。你使用什麼版本的.net/WPF?你的訂單對象如何實現? – willem

+1

我已經嘗試在只安裝了.NET 4的計算機上運行應用程序,並可以看到它崩潰。在AddNew或Edit Item事務期間,不允許出現異常消息_'Defer Refresh'。發生這種情況的原因是,DataGrid在驗證錯誤時會停留在editmode中,並在返回視圖時嘗試刷新,這會導致異常。 .NET 4.5中已修復此錯誤。你可以谷歌錯誤消息,但似乎沒有完美的解決方法。也許你可以提示用戶修改驗證錯誤,然後再離開DataGrid或其他東西? –

回答

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> 

最好是有所選項目的屬性上你的看法,而不是與元素名稱綁定模型,但它的測試確定。

相關問題