WPF ListView GridView单元格样式和绑定



我正在尝试将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)
};

最新更新