簡體   English   中英

WPF DataTemplate 從后面的代碼觸發綁定

[英]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..

我的代碼中的問題是列聲明的方式:

    var gridColumn = new GridViewColumn()
    {
        Header = col.ColumnName,
        DisplayMemberBinding = new Binding(col.ColumnName)
    };

DisplayMemberBinding具有比CellTemplate更高的優先級: https : CellTemplate ? CellTemplate = CellTemplate

您當前正在嘗試綁定到DataContext IsMouseOver ,而不是控件上。 您需要添加源:

mouseOverTrigger.Binding = new Binding() { Path = new PropertyPath("IsMouseOver"), RelativeSource = RelativeSource.Self };

或使用Trigger而不是DataTrigger

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM