簡體   English   中英

Silverlight DataGrid列驗證

[英]Silverlight DataGrid column validation

我的應用程序中有一個數據網格,並且我需要數據網格的某些列的值之和等於100。

如:

一個20

b 20

約60

這是對的

一個20

b 20

62 62

這個不對

有什么想法可以通過MVVM廣告INotifyDataErrorInfo來實現嗎?

我現在的問題是,如果我僅將屬性綁定到單元格,然后拋出ErrorChanged,則datagrid會將我鎖定在更改了數據的行上,因此除非恢復原始值以使之和,否則我將無法移動到任何地方。該列將再次變為100。

不要在CellEdit上發布帶有手動驗證的各種代碼隱藏解決方案或類似的內容-我自己可以編寫這種骯臟的代碼。 我正在嘗試尋找適合綁定和MVVM的干凈解決方案

就我所見,盡管 Silverlight Datagrid完全損壞,未完成且沒有人在乎。 也許有人知道那里有合適的數據網格(或者他們實際上是在Silverlight 5中修復的?)

現在使用以下:

在我的ViewModel構造函數中

        validator = new Validator(this);
        validator.AddValidationFor(() => PayElements).When(() => _payElements.Where(p1 => (!String.IsNullOrEmpty(p1.Distribution) && FormatChecker.IsDecimal(p1.Distribution, 3, 2))).Sum(p2 => Decimal.Parse(p2.Distribution)) != 100).Show("ERROR!");

這里的PayElements是我的收藏(順便說一句,我不好,它實際上是從_payElements創建的ICollectionView,它是ObservableCollection)。 然后OnChanges到任何對象

        validator.ValidateAll();

這將導致評估在構造函數中創建的驗證規則。 此后,我在整個對象集合的視圖模型的errorCOllection中都出現了Error,但是它沒有顯示任何紅色邊框。 在列表中,我可以看到有一個錯誤並禁用了保存按鈕:)

我已經在datagrid上實現了討厭的驗證,除非您必須執行異步驗證,否則從綁定對象中可以很好地完成它。 我不確定要綁定到列表的對象,但是我會使用類似以下的內容:

public string Col1Wrapper
{
    get
    {
        return this.Col1;
    }
    set
    {
        ValidateRequired("Col1Wrapper", value, "Required");
        ValidateRegularExpression("Col1Wrapper", value, @"^[\d]+$", "Must be digit");
        ValidateTotal(value,Col2,Col3,total);//in your case
        this.Col1 = value;
        this.RaisePropertyChanged("Col1Wrapper");
    }
}

public string Col2Wrapper
{
    get
    {
        return this.Col2;
    }
    set
    {
        ValidateRequired("Col2Wrapper", value, "Required");
        ValidateRegularExpression("Col2Wrapper", value, @"^[\d]+$", "Must be digit");
        ValidateTotal(Col1,value,Col3,total);//in your case
        this.Col2 = value;
        this.RaisePropertyChanged("Col2Wrapper");
    }
}

public string Col3Wrapper
{
    get
    {
        return this.Col3;
    }
    set
    {
        ValidateRequired("Col3Wrapper", value, "Required");
        ValidateRegularExpression("Col3Wrapper", value, @"^[\d]+$", "Must be digit");
        ValidateTotal(Col1,Col2,value,total);//in your case
        this.Col3 = value;
        this.RaisePropertyChanged("Col3Wrapper");
    }
}

然后使用http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifydataerrorinfo%28VS.95%29.aspx

默認實現在示例部分。

public bool ValidateRequired(string property, string value, string errorMessage)
{
    bool isValid = true;

    if (value == null || value == string.Empty)
    {
        AddError(property, errorMessage, false);
        isValid = false;
    }
    else RemoveError(property, errorMessage);
    RaiseErrorsChanged(property);
    return isValid;
}

public bool ValidateRegularExpression(string property, string value, string expression, string errorMessage)
{
    ...
}

public bool ValidateTotal(string property,int 1, int 2, int 3, int total, string errorMessage)
{
    if((1+2+3) != total)
        AddError(property, errorMessage, false);
    else RemoveError(property, errorMessage);
}

添加錯誤方法將觸發驗證摘要顯示在數據網格上。 希望這就是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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