Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF数据模板从代码隐藏触发绑定_C#_Wpf - Fatal编程技术网

C# WPF数据模板从代码隐藏触发绑定

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

我正在为代码隐藏中的ListView构建
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
sYour
ItemsSource
列表视图绑定不正确。这是核心问题。@dymanoid它怎么了?数据按应有的方式显示。您是否也通过触发器在模板中本地设置背景?本地值将覆盖任何触发器。唉,这也不起作用。顺便说一下,
Trigger
没有
Binding
属性。我的第一个想法也是使用
Trigger
,但是我找不到链接到
CellTemplate
背景的方法。我刚刚编辑了我的问题,使用了XAML中的
Trigger
s,而不是
DataTrigger
s。他们也没有开火。我已经检查了调试器,它们确实绑定了,但不知何故不会触发。
    var gridColumn = new GridViewColumn()
    {
        Header = col.ColumnName,
        DisplayMemberBinding = new Binding(col.ColumnName)
    };