C# WPF数据模板从代码隐藏触发绑定
我正在为代码隐藏中的ListView构建C# WPF数据模板从代码隐藏触发绑定,c#,wpf,C#,Wpf,我正在为代码隐藏中的ListView构建DataTemplates,因为在绑定时列的数量是未知的。将列添加到列表视图中的我的方法: private void FillListView(DataTable table) { GridView grid = (GridView)lvMain.View; var template = FindResource("cellTemplate"); foreach (DataColumn co
DataTemplates
,因为在绑定时列的数量是未知的。将列添加到列表视图中的我的方法
:
private void FillListView(DataTable table)
{
GridView grid = (GridView)lvMain.View;
var template = FindResource("cellTemplate");
foreach (DataColumn col in table.Columns)
{
var gridColumn = new GridViewColumn()
{
Header = col.ColumnName,
DisplayMemberBinding = new Binding(col.ColumnName)
};
gridColumn.CellTemplate = template;
gridColumn.CellTemplate.Triggers.Add(mouseOverTrigger);
gridColumn.CellTemplate.Triggers.Add(mouseNotOverTrigger);
grid.Columns.Add(gridColumn);
}
lvMain.ItemsSource = ((IListSource)table).GetList();
}
那些触发器永远不会触发。我假设可以通过添加到模板中的文本工厂来完成,但在这种情况下,我不知道如何以编程方式创建属性触发器
如何使从代码隐藏创建的DataTemplates
,对IsMouseOver
更改作出反应
UPD:我已将数据模板移动到资源中,并将触发器声明放在那里:
...
<UserControl.Resources>
<DataTemplate x:Key="cellTemplate" x:Name="cellTemplate">
<TextBlock x:Name="cellTextBlock" Text="{Binding}"/>
<DataTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="cellTextBlock" Property="Background" Value="Black"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="False">
<Setter TargetName="cellTextBlock" Property="Background" Value="White"/>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
</UserControl.Resources>
<ListView x:Name="lvMain" VirtualizingStackPanel.VirtualizationMode="Recycling">
<ListView.View>
<GridView>
</GridView>
</ListView.View>
</ListView>
...
给定的
模板
应用于列,但不影响任何内容-宽度都不是500,模板也不是由2个文本块
和奇怪的文本组成。您当前试图绑定到数据上下文
中的IsMouseOver
,而不是在控件上。您需要添加源:
mouseOverTrigger.Binding = new Binding() { Path = new PropertyPath("IsMouseOver"), RelativeSource = RelativeSource.Self };
或者使用
触发器
而不是数据触发器
我的代码中的问题是列声明的方式:
var gridColumn = new GridViewColumn()
{
Header = col.ColumnName,
DisplayMemberBinding = new Binding(col.ColumnName)
};
DisplayMemberBinding
的优先级高于CellTemplate
:
实际上,您不需要在WPF中的代码隐藏中创建任何数据模板。在您的代码中,我没有看到任何数据模板创建。我想你真正的问题是:如何将WPF的列表视图绑定到数据表,对吗?天哪,我已经从我的问题中删除了一行额外的内容。再加一次。不,实际的问题是“如何使ListView单元格对鼠标事件做出反应”,据我调查,最简单的事情是使用
DataTemplate
s和Trigger
sYourItemsSource
列表视图绑定不正确。这是核心问题。@dymanoid它怎么了?数据按应有的方式显示。您是否也通过触发器在模板中本地设置背景?本地值将覆盖任何触发器。唉,这也不起作用。顺便说一下,Trigger
没有Binding
属性。我的第一个想法也是使用Trigger
,但是我找不到链接到CellTemplate
背景的方法。我刚刚编辑了我的问题,使用了XAML中的Trigger
s,而不是DataTrigger
s。他们也没有开火。我已经检查了调试器,它们确实绑定了,但不知何故不会触发。
var gridColumn = new GridViewColumn()
{
Header = col.ColumnName,
DisplayMemberBinding = new Binding(col.ColumnName)
};