Есть ли у кого-нибудь пример проверки перекрестной строки для WPF Datagrid. Проверка уровня ячеек и проверка правильности Rowlevel не соответствуют моим требованиям. Я стараюсь как можно больше придерживаться MVVM. мой последний вариант - использовать код позади. поэтому в основном мне нужно получить доступ к Itemssource, когда что-то происходит в сетке. Буду признателен за любую оказанную помощь. Thanks -ReyWPF Datagrid Cross row Validation
ответ
по коду за добавлением частичного класса к каждой таблице.
Свойства [HasNoError] это возвращает истину, если нет ошибки
Свойства [Ошибка] является возвращать ошибки в виде строки
if(tablename.HasNoError)
{
// do your logic
}
else
{
// display tablename.Error
}
В XAML стороны использовать связывание
<DataGridTextColumn Binding="{Binding Path=ActualFieldName1, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged }" Header=" ActualFieldName1" />
и это образец класса с использованием IDataErrorInfo-
public partial class tablename : IDataErrorInfo
{
private Dictionary<string, string> errorCollection = new Dictionary<string, string>();
public bool HasNoError
{
get
{
return string.IsNullOrWhiteSpace(Error);
}
}
public string Error
{
get
{
if (errorCollection.Count == 0)
return null;
StringBuilder errorList = new StringBuilder();
var errorMessages = errorCollection.Values.GetEnumerator();
while (errorMessages.MoveNext())
errorList.AppendLine(errorMessages.Current);
return errorList.ToString();
}
}
public string this[string fieldName]
{
get
{
string result = null;
switch (fieldName)
{
case "ActualFieldName1":
if (string.IsNullOrWhiteSpace(this.ActualFieldName1))
{
result = "ActualFieldName1 is required.";
};
if (Other_Condition)
{
result = "Other Result";
};
break;
case "ActualFieldName2":
if (string.IsNullOrWhiteSpace(this.ActualFieldName2))
{
result = "ActualFieldName2 is required.";
};
if (Other_Condition)
{
result = "Other Result";
};
break;
// and so
}
if (result != null && !errorCollection.ContainsKey(fieldName))
errorCollection.Add(fieldName, result);
if (result == null && errorCollection.ContainsKey(fieldName))
errorCollection.Remove(fieldName);
return result;
}
}
}
Чтобы сделать это красиво добавить стиль к целевому шаблону ошибки см примера
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="1">
<Grid>
<AdornedElementPlaceholder x:Name="MyAdorner"/>
<Image Width="{Binding AdornedElement.ActualHeight, ElementName=MyAdorner}" Margin="0" ToolTip="{Binding AdornedElement.(Validation.Errors)[0].ErrorContent, ElementName=MyAdorner}" HorizontalAlignment="Right" VerticalAlignment="Center" Source="/Path/Exclamation.png" />
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Я верю выше, работает для проверки уровня ячейки. для моей проверки multirow, я нашел этот пост, http://stackoverflow.com/questions/1729414/wpf-datagrid-how-to-validate-multiple-rows-and-mark-all-invalid-ones, а также я совмещаю ur проверка уровня ячейки для отображения недопустимых ячеек. извините, я не могу отметить ответ ур как ответ, так как он не дает правильного решения моей проблемы. – Manohar
вы используете Entity Framework? –
yes и его приложение сервера клиентов ... – Manohar