3 つの列を持つ次の DataGrid を検討してください。
age が -1 になると、対応するセルが無効になります。
理想的には、ユーザーが無効なセルの値を変更できないようにする必要があります。ただし、ユーザーが行 1 にあり、キーボード フォーカスが列 Age の対応するセルにあり、Enter キーを押すと、ユーザーが任意の数字を入力すると、無効なセルがその値を取得します。これは望ましい動作ですか?どうすればこの動作を回避できますか?
問題を再現するには:
- Age列の1行目のセルを選択
- エンターを押す
- 数字を入力
再現可能なコード:
XAML:
<Window x:Class="wpf_behaviour.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="DataGridDetailsSample" Height="200" Width="400">
<Grid Margin="10">
<DataGrid Name="dgUsers" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding Id}"/>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
<DataGridTextColumn Header="Age" Binding="{Binding Age}">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell" BasedOn="{StaticResource {x:Type DataGridCell}}">
<Style.Triggers>
<DataTrigger Binding="{Binding Age}" Value="-1">
<Setter Property="IsEnabled" Value="False"/>
<Setter Property="ToolTip" Value="This filed is diabled."/>
<Setter Property="Background" Value="LightGray"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
対応する cs:
using System.Collections.Generic;
using System.Windows;
using System.Windows.Documents;
namespace wpf_behaviour
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<User> users = new List<User>();
users.Add(new User() { Id = 1, Name = "Kumar", Age = 10 });
users.Add(new User() { Id = 2, Name = "Sameer", Age = -1 });
users.Add(new User() { Id = 3, Name = "Danny", Age= 16 });
dgUsers.ItemsSource = users;
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
}
}
}