我正在尝试将DataTable
绑定到ListView。由于列的数量是未知的,因此绑定是以编程方式完成的。基本上有两种绑定方式:DisplayMemberBinding
和模板。如何设置DisplayMemberBinding
样式或将模板绑定到单元格?
这是我的代码:
private void FillListView(DataTable table)
{
GridView grid = (GridView)lvMain.View;
DataTemplate template = (DataTemplate)FindResource("cellTemplate");
foreach (DataColumn col in table.Columns)
{
var gridColumn = new GridViewColumn()
{
Header = col.ColumnName,
// One of these works, displaymember has higher priority
DisplayMemberBinding = new Binding(col.ColumnName),
CellTemplate = template
};
grid.Columns.Add(gridColumn);
}
lvMain.ItemsSource = ((IListSource)table).GetList();
}
和XAML代码:
<UserControl.Resources>
<DataTemplate x:Key="cellTemplate" x:Name="cellTemplate">
<DataTemplate.Resources>
<Style TargetType="Border">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Black"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter Property="Background" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</DataTemplate.Resources>
<Border >
<StackPanel>
<!-- How can I bind here? -->
<TextBlock Text="{Binding}"/>
</StackPanel>
</Border>
</DataTemplate>
</UserControl.Resources>
<ListView x:Name="lvMain">
<ListView.View>
<GridView>
</GridView>
</ListView.View>
</ListView>
您需要为每个属性创建一个DataTemplate
以绑定到.
您可以使用XamlReader.Parse
方法以编程方式创建它们:
private static DataTemplate CreateTemplate(string sourceProperty)
{
string Xaml = "<DataTemplate xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">" +
" <DataTemplate.Resources>" +
" <Style TargetType="Border">" +
" <Style.Triggers>" +
" <Trigger Property="IsMouseOver" Value="True">" +
" <Setter Property="Background" Value="Black"/>" +
" </Trigger>" +
" <Trigger Property="IsMouseOver" Value="False">" +
" <Setter Property="Background" Value="White"/>" +
" </Trigger>" +
" </Style.Triggers>" +
" </Style>" +
" </DataTemplate.Resources>" +
" <Border>" +
" <StackPanel>" +
" <TextBlock Text="{Binding " + sourceProperty + "}"/>" +
" </StackPanel>" +
" </Border>" +
" </DataTemplate>";
return XamlReader.Parse(Xaml) as DataTemplate;
}
var gridColumn = new GridViewColumn()
{
Header = col.ColumnName,
CellTemplate = CreateTemplate(col.ColumnName)
};