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