C# 如何在WPF XAML中定义ListView模板并在代码隐藏中绑定它?

C# 如何在WPF XAML中定义ListView模板并在代码隐藏中绑定它?,c#,wpf,datatemplate,C#,Wpf,Datatemplate,我想定义ListView模板,并在必要时调用它。 我有一个tabcontrol,在该选项卡中我以编程方式创建选项卡项。每个选项卡项都必须具有该listview模板。我可以将listview作为contenttemplate提供给tabitem,它可以正确显示listview,但是如何将我的结构作为源提供给该listview模板呢 XAML <Window.Resources> <DataTemplate x:Key="MeshListViewTemplate">

我想定义ListView模板,并在必要时调用它。 我有一个tabcontrol,在该选项卡中我以编程方式创建选项卡项。每个选项卡项都必须具有该listview模板。我可以将listview作为contenttemplate提供给tabitem,它可以正确显示listview,但是如何将我的结构作为源提供给该listview模板呢

XAML

<Window.Resources>
    <DataTemplate x:Key="MeshListViewTemplate">
        <!--ListView-->
        <ListView  Background="AliceBlue" Margin="0,-4,0,4">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Index" DisplayMemberBinding="{Binding Index}" Width="40"/>
                    <GridViewColumn Header="NormalX" DisplayMemberBinding="{Binding NormalX}" Width="60"/>
                    <GridViewColumn Header="NormalY" DisplayMemberBinding="{Binding NormalY}" Width="60"/>
                    <GridViewColumn Header="NormalZ" DisplayMemberBinding="{Binding NormalZ}" Width="60"/>
                    <GridViewColumn Header="PosX" DisplayMemberBinding="{Binding PosX}" Width="60"/>
                    <GridViewColumn Header="PosY" DisplayMemberBinding="{Binding PosY}" Width="60"/>
                    <GridViewColumn Header="PosZ" DisplayMemberBinding="{Binding PosZ}" Width="60"/>
                </GridView>
            </ListView.View>
            <!--LISTVIEW ITEM STYLE-->
            <ListView.ItemContainerStyle>
                <Style TargetType="{x:Type ListViewItem}">
                    <EventSetter Event="MouseDoubleClick" Handler="Meshes_ListViewItem_MouseDoubleClick"/>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="ListViewItem">
                                <Border CornerRadius="2" SnapsToDevicePixels="True"
                                    BorderThickness="{TemplateBinding     BorderThickness}" 
                                    BorderBrush="{TemplateBinding BorderBrush}" 
                                    Background="{TemplateBinding Background}">
                                    <Border Name="InnerBorder" CornerRadius="1"   BorderThickness="1">
                                        <Grid>
                                            <Grid.RowDefinitions>
                                                <RowDefinition MaxHeight="11" />
                                                <RowDefinition />
                                            </Grid.RowDefinitions>
                                            <Rectangle Name="UpperHighlight" Visibility="Collapsed" Fill="#75FFFFFF" />
                                            <GridViewRowPresenter Grid.RowSpan="2" 
                                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                            SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                                        </Grid>
                                    </Border>
                                </Border>
                                <ControlTemplate.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter Property="Background" Value="LightBlue"/>
                                    </Trigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style>
            </ListView.ItemContainerStyle>
            <!--End Item Style-->
        </ListView>
        <!--End ListView-->
    </DataTemplate>
</Window.Resources>

C#

私有结构网格
{
公共int索引{get;set;}
公共双法线x{get;set;}
公共双正规{get;set;}
公共双正规z{get;set;}
公共双PosX{get;set;}
公共双PosY{get;set;}
公共双PosZ{get;set;}
}
DataTemplate MeshListViewTemplate=(DataTemplate)FindResource(“MeshListViewTemplate”);
public void updateMessagesListView(TabControl TabControlMesh,字符串tabName,System.Windows.DataTemplate MeshListViewTemplate)
{
如果(法线==null | |位置==null)
返回;
TabItem ti=新TabItem();
ti.Header=tabName;
ti.ContentTemplate=MeshListViewTemplate;
Dictionary meshList=新字典();
Mesh Mesh;//Mesh是我的结构,具有索引、法线和位置
int count=meshes.TriangleIndices.count;
for(int i=0;i
您只在
选项卡Item
上设置
内容模板
,而不设置内容。在将ti添加到TabControlMesh之前,请尝试将ti.Content设置为meshList.Value。代码:ti.Content=meshList.Values。但是,您应该真正了解并使用MVVM和数据绑定。您只是在
选项卡项上设置
ContentTemplate
,而不是内容。在将ti添加到TabControlMesh之前,请尝试将ti.Content设置为meshList.Value。代码:ti.Content=meshList.Values。但是,您应该真正了解并使用MVVM和数据绑定。
 private struct Mesh
    {
        public int Index { get; set; }
        public double NormalX { get; set; }
        public double NormalY { get; set; }
        public double NormalZ { get; set; }
        public double PosX { get; set; }
        public double PosY { get; set; }
        public double PosZ { get; set; }           
    }
    DataTemplate MeshListViewTemplate =(DataTemplate)FindResource("MeshListViewTemplate");

 public void updateMeshesListView(TabControl tabControlMeshes, string tabName, System.Windows.DataTemplate MeshListViewTemplate)
    {
        if (normals == null || positions == null)
            return;
        TabItem ti = new TabItem();
        ti.Header = tabName;
        ti.ContentTemplate = MeshListViewTemplate;
        Dictionary<int, Mesh> meshList = new Dictionary<int, Mesh>();
        Mesh mesh;// Mesh is my Struct that have index, normals and position
        int count = meshes.TriangleIndices.Count;
        for (int i = 0; i < count; i++)
        {
            mesh = new Mesh();
            mesh.Index = i;
            mesh.NormalX = normals[i].X;
            mesh.NormalY = normals[i].Y;
            mesh.NormalZ = normals[i].Z;
            mesh.PosX = positions[i].X;
            mesh.PosY = positions[i].Y;
            mesh.PosZ = positions[i].Z;
            meshList.Add(i,mesh);

        }          
        tabControlMeshes.Items.Add(ti);
    }