【发布时间】:2013-12-05 11:01:26
【问题描述】:
我有一个 DataGrid,其中填充了一个公开 double 类型属性的类的实例。此属性显示在 DataGrid 中。我想实现自定义验证,如果验证失败,我想将整个单元格涂成红色。我想我已经接近让它发挥作用了,但还没有,现在我被难住了。
我的问题是我无法使条件(验证失败)格式化工作。结果是单元格在开始时被正确着色,但是当我插入一个使验证函数返回 false 的值时,我得到了通常的红色边框,白色背景单元格样式。
我应该如何输入这种格式样式?
XAML 代码:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<DataGrid x:Name="dg" ItemsSource="{Binding Data}">
<DataGrid.Resources>
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<AdornedElementPlaceholder/>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
</DockPanel>
</ControlTemplate>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Background" Value="Yellow"/>
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource validationTemplate}"></Setter>
</Style>
</DataGrid.Resources>
</DataGrid>
</Window>
后面的代码:
public partial class MainWindow : Window
{
...
private void DataGrid_AutoGeneratedColumns(object sender, EventArgs e)
{
foreach (DataGridTextColumn c in dg.Columns)
{
c.ElementStyle = (Style)dg.FindResource("s");
for (int i = 0; i < dg.Items.Count; i++)
{
DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
if (row == null) // May be virtualized, bring into view and try again.
{
dg.UpdateLayout();
dg.ScrollIntoView(dg.Items[i]);
row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(i);
}
TextBlock tb = (TextBlock)c.GetCellContent(row);
Binding binding = BindingOperations.GetBinding(tb, TextBlock.TextProperty);
binding.ValidationRules.Clear();
binding.ValidationRules.Add(new VR());
}
}
}
}
public class VR : ValidationRule
{
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
...
}
}
编辑:根据开发刺猬的建议更新了 XAML 代码,但仍然无法正常工作。
【问题讨论】:
标签: c# wpf validation datagrid