[英]WPF DataTemplate Trigger binding from code behind
我正在為后面的代碼中的 ListView 構造DataTemplates
,因為在綁定時列數是未知的。 我將列添加到ListView
:
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:我已經將 DataTemplate 移到了 Resources 並在那里放置了 Triggers 聲明:
...
<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>
...
UPD 2:我想知道為什么,但是在以某種方式應用循環之前聲明的template
,我不明白。 例如,如果我在 XAML 代碼中添加一些奇怪的東西,讓DataTemplate
看起來像這樣:
<DataTemplate x:Key="cellTemplate" x:Name="cellTemplate">
<DataTemplate.Resources>
<Style TargetType="TextBlock">
<Setter Property="FontSize" Value="500"/>
</Style>
</DataTemplate.Resources>
<DataTemplate.Triggers>
...
</DataTemplate.Triggers>
<Grid>
<TextBlock Text="{Binding}"/>
<TextBlock>asdfasdfad</TextBlock>
</Grid>
</DataTemplate>
給定的template
應用於一列,但不影響任何東西—— width
既不是 500,也不是模板包含 2 個帶有奇怪文本的TextBlock
s..
您當前正在嘗試綁定到DataContext
IsMouseOver
,而不是控件上。 您需要添加源:
mouseOverTrigger.Binding = new Binding() { Path = new PropertyPath("IsMouseOver"), RelativeSource = RelativeSource.Self };
或使用Trigger
而不是DataTrigger
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.