[英]WPF DataGrid Validation Bug?
這可能是預期的功能,但對我來說似乎確實是個錯誤。
我使用的是現成的WPF DataGrid,綁定到ObservableCollection,並嘗試使用一些驗證規則以提供良好的用戶反饋。 毋庸置疑,還有更多的問題我無法指望,但我會堅持當下。
這是問題的摘要:
ItemsSource
屬性綁定到ObservableCollection<T>
ObservableCollection<T>
刪除該項目 執行這些步驟后,GridView會正確識別該項目已從集合中刪除,並從網格中刪除該行。 但是, 網格現在陷入了無效狀態,無法通過網格上的UI執行進一步的操作!
同樣,對於我來說,這似乎是一個主要錯誤,因為能夠以編程方式從集合中刪除項目非常重要。
有人碰到這個嗎? 關於如何解決它的任何建議?
值得注意的是,我創建了一個單獨的解決方案只是為了隔離此問題,但為了回答您可能遇到的一些問題:
您的對象是否實現INotifyPropertyChanged
? 是
這是自定義收藏嗎? 沒有普通的舊ObservableCollection<T>
您如何從收藏夾中刪除物品?
//Find any newly added item and remove it
var someObject = SomeObjects
.Where(obj => obj.SomeProperty == SomeValue)
.First();
SomeObjects.Remove(someObject );
您如何綁定驗證規則?
<DataGridTextColumn Header="SomeProperty">
<DataGridTextColumn.Binding>
<Binding Path="SomeProperty">
<Binding.ValidationRules>
<val:RequiredValidator ValidationStep="ConvertedProposedValue"
ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
您的驗證規則是什么樣的?
public class RequiredValidator : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
if (value == null || String.IsNullOrWhiteSpace(value as String))
return new ValidationResult(false, "Field is required!");
return ValidationResult.ValidResult;
}
}
我花了幾個小時試圖找出正在發生的事情。 最后,對Items進行簡單的刷新即可解決該問題。 希望這可以幫助。
YourDataGrid.Items.Refresh();
我遇到了同樣的問題,經過漫長的搜索過程,我找到了解決方案:
您可以創建一個從DataGrid派生的類。 您可以在那里通過反射訪問私有屬性。 如果現在刪除無效的項目,則可以調用函數SetGridWritable(),其他值可以再次編輯。
public class MyDataGrid : DataGrid
{
public void SetGridWritable()
{
BindingFlags bindingFlags = BindingFlags.FlattenHierarchy | BindingFlags.NonPublic | BindingFlags.Instance;
PropertyInfo cellErrorInfo = this.GetType().BaseType.GetProperty("HasCellValidationError", bindingFlags);
PropertyInfo rowErrorInfo = this.GetType().BaseType.GetProperty("HasRowValidationError", bindingFlags);
cellErrorInfo.SetValue(this, false, null);
rowErrorInfo.SetValue(this, false, null);
}
}
如果您有興趣,我有一個非解決方案:
我們發現整個驗證機制充滿了不良行為。 例如-我們想允許我們的用戶輸入無效的數據,並且僅標記錯誤。
為此,我們創建了一個帶有紅色邊框的單元格模板,該模板與數據觸發器綁定,只要給定屬性的錯誤狀態發生更改,就會觸發該觸發器。 數據觸發的實際創建是通過依賴項屬性完成的,該依賴項屬性接收到ViewModel屬性的綁定路徑並創建綁定
即:
DataTrigger errorTrigger = CreateTrigger(CreateDirectBinding(property,new HasErrorValueConverter()), CreateErrorSetter(property));
這可以解決與驗證錯誤相關的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.