行がない場合、DataGrid の周りに赤い枠を付けたいと思います (ItemsSource へのバインドを行っています)。
だから私はWPF検証のためにこのガイドに従っていました:
http://www.codeproject.com/Articles/15239/Validation-in-Windows-Presentation-Foundation
とにかく、次の場合にテキストボックスにそのようなエラーを発生させるのは簡単Text = ""
です:
エラーをカスタマイズすることもできます:
デバッグを試みましたが、ItemsSource 内にバインドされている ValidationRules が呼び出されません。
<DataGrid ...>
<DataGrid.ItemsSource>
<Binding Path="Lines" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataGridValidationRule
MiniumRows="1"
MaximumRows="100"
ErrorMessage="must have between 1 and 100 rows">
</DataGridValidationRule>
</Binding.ValidationRules>
</Binding>
</DataGrid.ItemsSource>
</DataGrid>
そして、DataGridValidtionRule クラスは次のようになります。
public class public class StringRangeValidationRule : ValidationRule
{
private int _minimumRows = -1;
private int _maximumRows = -1;
private string _errorMessage;
public int MinimumRows
{
get { return _minimumRows ; }
set { _minimumRows = value; }
}
public int MaximumRows
{
get { return _maximumLength; }
set { _maximumLength = value; }
}
public string ErrorMessage
{
get { return _errorMessage; }
set { _errorMessage = value; }
}
public override ValidationResult Validate(object value,
CultureInfo cultureInfo)
{
ValidationResult result = new ValidationResult(true, null);
ObservableCollection<Lines> lines = (ObservableCollection<Lines>) value;
if (lines.Count < this.MinimumRows||
(this.MaximumRows> 0 &&
lines.Count > this.MaximumRows))
{
result = new ValidationResult(false, this.ErrorMessage);
}
return result;
}
そして「Lines」クラス
public class Line
{
public Line(string f, string b)
{
foo = f;
bar = b;
}
public string Foo {get; set;}
public string Bar {get; set;}
}
編集:
私のデータグリッドの「行の削除」ボタンは、実際の DataGrid からではObservableCollection
なく、実際の DataGrid から削除されていたことがわかりました (ViewModel で削除されていました)...そして、何らかの理由で、これにより Validation 呼び出しが呼び出されなくなりました。
再びビュー:
<DataGrid Name="mygrid">
<DataGrid.ItemsSource>
<Binding Path="Lines" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataGridValidationRule
MiniumRows="1"
MaximumRows="100"
ErrorMessage="must have between 1 and 100 rows">
</DataGridValidationRule>
</Binding.ValidationRules>
</Binding>
</DataGrid.ItemsSource>
</DataGrid>
したがって、ViewModel にある場合:
void delete(Line l)
{
Lines.Remove(l); //if you delete everything (grid empty) there won't be any error shown.
}
データグリッドの周りにエラーの境界線とアイコンが表示されません。
しかし、代わりに、次のように ItemsSource を直接変更するイベントを配置した場合:
void delete(Line l)
{
Lines.Remove(l);
myView.mygrid.ItemsSource = Lines; // this magically fixes everything... even though it was already bound to Lines... though i hate to directly access the View from within the ViewModel.
}
正確な理由はわかりません...しかし、それで修正されました。ビューを VM から分離する方法についてのアイデアはありますか? 私はこの修正があまり好きではありません。