我試過不同的事情,我想知道如何將行計數器添加到數據網格的左側? (就像我們看到在Excel)WPF數據網格,如何創建「左側」標題?
我看到它的可能:
但我不知道如何實現這一目標。我承認我是一個新手當談到WPF,但在對象屬性中沒有「複選框」來激活它,到目前爲止我沒有遇到任何明確的代碼,所以我不知道它,所以我不知道如果它簡單,或者一些精心的破解。
ty。
我試過不同的事情,我想知道如何將行計數器添加到數據網格的左側? (就像我們看到在Excel)WPF數據網格,如何創建「左側」標題?
我看到它的可能:
但我不知道如何實現這一目標。我承認我是一個新手當談到WPF,但在對象屬性中沒有「複選框」來激活它,到目前爲止我沒有遇到任何明確的代碼,所以我不知道它,所以我不知道如果它簡單,或者一些精心的破解。
ty。
關於如何在以下鏈接上提供的完整代碼示例可用。
添加右對齊行號在WPF一個DataGridRowHeader:https://blog.magnusmontin.net/2014/08/18/right-aligned-row-numbers-datagridrowheader-wpf/
你可以把一個TextBlock
在DataGrid
的RowHeaderTemplate
和使用轉換器來獲得該行的索引:
<DataGrid ItemsSource="{Binding Countries}" AutoGenerateColumns="False"
xmlns:local="clr-namespace:Mm.WpfApplication1">
<DataGrid.Columns>
<DataGridTextColumn Header="Country" Binding="{Binding Name}"/>
</DataGrid.Columns>
<DataGrid.Resources>
<local:RowNumberConverter x:Key="converter"/>
</DataGrid.Resources>
<DataGrid.RowHeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=.,
RelativeSource={RelativeSource AncestorType=DataGridRow},
Converter={StaticResource converter}}"></TextBlock>
</DataTemplate>
</DataGrid.RowHeaderTemplate>
<DataGrid.RowHeaderStyle>
...
</DataGrid.RowHeaderStyle>
</DataGrid>
但是這種方法只會在虛擬化被禁用或者您的ItemsSource
中只有幾行時才起作用。如果要正確顯示行號但仍保留DataGrid
的默認虛擬化和回收行爲,則可以處理DataGrid
的LoadingRow
事件,以將DataGridRow
的Header
屬性設置爲行號,然後綁定到此屬性RowHeaderTemplate
。
還要注意的是,如果DataGrid
綁定到ObservableCollection<T>
和您添加或在運行時動態從中刪除項目/,行號要等到你開始滾動和更新LoadingRow
事件再次發射。
爲了解決這個問題,你可以掛鉤的事件處理程序ItemsChanged
事件在視圖中DataGrid
的ItemContainerGenerator
和重置所有DataGridRow
元素是目前在可視化樹在該事件發生的Header
財產。
請參考上面的鏈接瞭解更多信息和完整的工作示例。
謝謝。棒極了。 –
使用數據表來佔滿DataGrid,然後使用
主窗口
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
<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();
}
}
好吧,這並不簡單,但它也不完全是黑客。這或多或少會成爲您必須制定的自定義控件。我不認爲你應該擔心,直到你在WPF中擁有更強的基礎。 (說起剛剛從winforms轉換到WPF的人)。 –
謝謝。我將處理我的WPF基礎知識。我希望這是一個「複選框」的東西,而不是製作我自己的自定義控件。 –