2013-03-12 149 views
0

我試圖驗證由DataView(例如myDataGrid.ItemsSource = myDataView)填充的DataGrid上的輸入。但是,我所見過的所有WPF DataGrid驗證示例都假設DataGrid源是C#類。我無法弄清楚如何將單個單元格(即列)連接到代碼隱藏驗證。有人可以舉個例子,或者指給我一個例子嗎?當綁定到DataView時WPF DataGrid驗證

+0

您看到的例子可能是最好的前進方向;你確定你不想那樣嗎?整體而言,WPF非常適合這種風格,反對它通常更困難。 – 2013-03-12 22:07:06

+0

我不知道將DataView作爲DataGrid的數據源分配是微不足道的,但在這種情況下確實很難執行驗證。 – Conrad 2013-03-12 23:08:01

回答

0

所以我做了一些更多的研究,而我基本上缺少的是我可以指定屬性的屬性的列名(或者甚至使用括號中的列序號,,例如Path="[0]")。在實現後,所有內容基本上與使用類屬性相同。因此,我使用的典型DataGrid列定義如下:

<DataGridTextColumn Header="Regular" EditingElementStyle="{StaticResource ValidationErrorStyleBoxRA}" ElementStyle="{StaticResource ValidationErrorStyleBlockRA}" Width="60"> 
    <DataGridTextColumn.Binding> 
     <Binding Path="HourlyRate" StringFormat="F3" ValidatesOnExceptions="True" ValidatesOnDataErrors="True" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <local:HourlyRatesAmountValidate ValidatesOnTargetUpdated="True" /> 
      </Binding.ValidationRules> 
     </Binding> 
    </DataGridTextColumn.Binding> 
</DataGridTextColumn> 
0

好的,我做了一些快速測試;我認爲真正做到這一點的主要障礙是DataGridCell在直接分配DataView進行顯示時不會爲其內容創建任何綁定。但是,如果您願意在創建DataGrid時跳過分配自定義DataGridTemplateColumn的環節,則可以訪問模板內的TextBox實例上的綁定,並在其上設置自定義驗證錯誤。

實際上,無論是這個還是覆蓋由DataGrid生成的文本框的默認樣式;您會發現,默認的文本框樣式沒有任何邊框或任何東西,因此在其上設置驗證錯誤沒有任何效果。使用DataTemplate將其變爲一個正常的文本框或覆蓋其樣式將使您能夠實際上使某些內容可見,作爲設置驗證錯誤的效果。

然而,你需要自己做一些研究;我做了一個快速的原型,並且工作正常,但是我無法在DataTemplate中正確創建綁定(或者忘記了我上次使用它之後所知道的所有WPF,或者我只知道如何使用適當的綁定:)) 。如果你在某個地方看到它會更容易:

以某種方式訪問​​BindingExpression;我所做的是將處理程序附加到LostFocus事件,並檢查丟失的焦點是否是DataGridCell內的文本框;如果是這樣,我只是標誌着該綁定爲無效(與t代表一個TextBox實例):

var x = t.GetBindingExpression(TextBox.TextProperty); 

Validation.MarkInvalid(x, new ValidationError(new ExceptionValidationRule(), x.ParentBinding, "error", new Exception("error"))); 

我必須承認我不知道了每個參數的作用是什麼在ValidationError構造函數(我覺得異常消息是否在驗證工具提示中默認顯示?或者它是錯誤內容?),但我相信你可以弄明白。現在如果你不介意,我想我會休息一下...就像我說的,這不是容易違反流程:)