簡體   English   中英

WPF DataGrid驗證錯誤?

[英]WPF DataGrid Validation Bug?

這可能是預期的功能,但對我來說似乎確實是個錯誤。

我使用的是現成的WPF DataGrid,綁定到ObservableCollection,並嘗試使用一些驗證規則以提供良好的用戶反饋。 毋庸置疑,還有更多的問題我無法指望,但我會堅持當下。

這是問題的摘要:

  1. ItemsSource屬性綁定到ObservableCollection<T>
  2. 填充集合
  3. 以一種會導致驗證錯誤的方式編輯網格中的項目
  4. 以編程方式從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM