メインウィンドウ
public MainWindow()
{
InitializeComponent();
DataTable tab = new DataTable();
for (int i = 0; i < 10; i++)
tab.Columns.Add("col " + i.ToString());
for (int i = 0; i < 1000; i++)
{
DataRow r = tab.NewRow();
for (int j = 0; j < 10; j++)
r[j] = "row " + (i).ToString() + "-col " + (j).ToString();
tab.Rows.Add(r);
}
dg.ItemsSource = tab.AsDataView();
}
XAMLを使用し、その後、データグリッドを埋めるとしたDataTableを使用し
<Window.Resources>
<local:HeaderConverter x:Key="headerConverter"/>
</Window.Resources>
<Grid>
<DataGrid Name="dg">
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock MinWidth="30" TextAlignment="Center">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource headerConverter}">
<Binding Path="ItemsSource" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGrid}" />
<Binding Path="Item" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=DataGridRow}"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
</DataGrid>
</Grid>
コンバータ
public class HeaderConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
int ind = -1;
DataView dv = values[0] as DataView;
if (dv != null)
{
DataRowView drv = values[1] as DataRowView;
ind = dv.Table.Rows.IndexOf(drv.Row);
}
else
{
System.Collections.IEnumerable ien = values[0] as System.Collections.IEnumerable;
ind = IndexOf(ien, values[1]);
}
if (ind == -1)
return "";
else
return (ind + 1).ToString();
}
static int IndexOf(System.Collections.IEnumerable source, object value)
{
int index = 0;
foreach (var item in source)
{
if (item.Equals(value))
return index;
index++;
}
return -1;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
出典
2017-02-18 23:40:14
Ron
まあそれは簡単ではありませんが、それはどちらか正確にハックではありません。それは多かれ少なかれカスタムコントロールを作る必要があります。私はあなたがWPFでより強力な立場を持つまで、心配する必要はないと思います。 (ちょうど最近winformsからWPFに切り替えた人として話す)。 –
ありがとうございます。私はWPFの基本について作業します。私は自分のカスタムコントロールを作る代わりに、これを "チェックボックス"のものにすることを望んでいました。 –