1

GridRow(カスタムクラス、グリッドの行の説明) のコレクションにバインドする編集可能なグリッドがあります。GridRowプロパティParameter (int)があり、ユーザーが編集する必要があります。したがって、単純な検証は正常に機能します。このフィールドに「テキスト」などを挿入することはできません。しかし、グリッド全体で検証する必要があります。グリッド上の列Parameterには、1つのシンボル「1」、2つの「2」、3つの「3」、2つの「5」のみを含めることができます。したがって、たとえば、すでにグリッド値「1,2,3」に挿入し、「1」を挿入しようとすると、アプリは検証メッセージを表示するはずです。でこれをやろうとしていIDataErrorInfoますが、セッターテーブル全体に入ることができません。

4

2 に答える 2

1

「CellVaildate」イベントの購読に関する問題を修正しました。

于 2012-06-14T06:44:19.723 に答える
1

おそらく、MVVM でのビジネス ルールの検証に関するブログ記事に興味があるでしょうか?

ViewModel からモデル検証コードをアタッチできるようになり、やろうとしていることを達成できるはずです。

public class GridViewModel
{
    // Kept this generic to reduce code here, but it
    // should be a full property with PropertyChange notification
    public ObservableCollection<GridRowModel> GridRows{ get; set; }

    public UsersViewModel()
    {
        GridRows = GetGridRows();

        // Add the validation delegate to the UserModels
        foreach(var row in GridRows)
            user.AddValidationErrorDelegate(ValidateGridRow);
    }

    // User Validation Delegate to verify UserName is unique
    private string ValidateGridRow(object sender, string propertyName)
    {
        if (propertyName == "Parameter")
        {
            var row = (GridRow)sender;
            var existingCount = GridRows.Count(p => 
                p.Parameter == row.Parameter && p != row);

            switch(row.Parameter)
            {
                case 1:
                    if (existingCount >= 0)
                        return string.Format("{0}s are already taken", row.Parameter);
                case 2: case 5:
                    if (existingCount >= 1)
                        return string.Format("{0}s are already taken", row.Parameter);
                case 3:
                    if (existingCount >= 2)
                        return string.Format("{0}s are already taken", row.Parameter);
             }
        }
        return null;
    }
}
于 2012-06-13T16:06:40.580 に答える