[英]Styling autogenerated DataGrid column on validation failure
我有一個DataGrid充滿了暴露double
類型屬性的類的實例。 此屬性顯示在DataGrid中。 我想實現一個自定義驗證,如果驗證失敗,我想將整個單元格塗成紅色。 我認為我即將使它起作用,但還沒有完成,現在我很困惑。
我的問題是我無法使條件式(驗證失敗)格式化工作。 結果是單元格在開始時就已正確着色,但是當我插入一個使falidating函數返回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代碼,仍然無法正常工作。
您似乎使用ErrorTemplate錯誤。
看看這個:
<ControlTemplate x:Key="validationTemplate">
<DockPanel>
<TextBlock Foreground="Red" FontSize="20">!</TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
<TextBox Name="textBox1" Width="50" FontSize="15"
Validation.ErrorTemplate="{StaticResource validationTemplate}"
Style="{StaticResource textBoxInError}"
Grid.Row="1" Grid.Column="1" Margin="2">
<TextBox.Text>
<Binding Path="Age" Source="{StaticResource ods}"
UpdateSourceTrigger="PropertyChanged" >
<Binding.ValidationRules>
<c:AgeRangeRule Min="21" Max="130"/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
Validation.ErrorTemplate將允許您裝飾AdornedElementPlaceholder(在本例中為TextBox)。
在這個例子中,我給你一個紅色! 將裝飾在TextBox的左側。
編輯:
我更改了您的代碼以使其正常運行。
<Grid>
<DataGrid x:Name="dg" ItemsSource="{Binding Data}" PreparingCellForEdit="OnBeginningEdit">
<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}"/>
</Style>
</DataGrid.Resources>
</DataGrid>
</Grid>
這是背后的代碼
public partial class MainWindow : Window
{
public List<D> Data { get; set; }
public MainWindow()
{
Data = new List<D>();
Random r = new Random();
Data.Add(new D(r.NextDouble()));
Data.Add(new D(r.NextDouble()));
Data.Add(new D(r.NextDouble()));
InitializeComponent();
DataContext = this;
}
private void DataGrid_AutoGeneratedColumns(object sender, EventArgs e)
{
foreach (DataGridTextColumn c in dg.Columns)
{
c.EditingElementStyle = (Style)dg.FindResource("s");
}
}
private void OnBeginningEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
TextBox tbx = (TextBox)e.EditingElement;
Binding binding = BindingOperations.GetBinding(tbx, TextBox.TextProperty);
binding.ValidationRules.Clear();
binding.ValidationRules.Add(new VR());
}
}
看到您需要使用TextBoxes,並且當您在其中寫東西時,單擊鼠標以觸發驗證。
試試看。 這個對我有用 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.