C# 向多列列表视图(WPF)添加数据(不仅仅是文本)
我正在C.NET4.0中开发一个WPF应用程序,其中有一个ListView和一个GridView,GridView有两列 我希望在代码中动态添加行。我的困境是,只有第一列会添加常规文本。第二列将有一个对象,该对象包含一个带有文本块的多列网格。参见链接 如果我像您通常那样在所有列中输入文本,即DisplayMemberBinding,那么我在第二列中得到的是text System.Windows.Grid,这显然不是我想要的 作为参考,如果我只是尝试添加带有代码listView1.Items.Addgrid1的TextBlocks的Grid对象,而不使用DisplayMemberBinding,则该对象将仅添加到第二列,第一列为空,而不是它通常如何处理所有列中结束相同文本的文本 我希望我的问题足够详细,如果有任何帮助,我将不胜感激 编辑: 我尝试了以下代码,但是每次单击按钮添加新行时,每一行都会使用相同的datatemplate进行更新。第二列总是在每一行上显示相同的数据 xaml: 代码:C# 向多列列表视图(WPF)添加数据(不仅仅是文本),c#,wpf,xaml,listview,C#,Wpf,Xaml,Listview,我正在C.NET4.0中开发一个WPF应用程序,其中有一个ListView和一个GridView,GridView有两列 我希望在代码中动态添加行。我的困境是,只有第一列会添加常规文本。第二列将有一个对象,该对象包含一个带有文本块的多列网格。参见链接 如果我像您通常那样在所有列中输入文本,即DisplayMemberBinding,那么我在第二列中得到的是text System.Windows.Grid,这显然不是我想要的 作为参考,如果我只是尝试添加带有代码listView1.Items.Ad
您不必使用DisplayMemberBinding,对于复杂内容,您可以使用,例如:
实际上,我开始胡闹创建动态datattemplates,但后来我发现每行的第二列都用最新创建的模板进行了更新。我不知道如何使每一行都能在第二列中显示不同的动态数据。您似乎不了解datatemplates应该如何使用,每次单击按钮时,您似乎都会重新创建数据模板,而您所要做的只是将数据添加到源集合中,然后由静态数据模板将其转换为可视化表示。是的,这就是我正在做的。对不起,我是WPF的新手。问题是,我认为我不能使用静态数据模板,因为其中的控件对于每一行都必须是动态的。那么,解决我的问题的最佳方法是什么?看看上面的代码,希望至少能给我一个提示,说明我正在努力完成什么。你可以用它做各种动态的事情,问题是你有什么样的数据。谢谢你,H.B。多亏了你的代码,我终于找到了答案
<Window x:Class="TEST.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Name="AAA" Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid Name="grid1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="374*" />
<ColumnDefinition Width="129*" />
</Grid.ColumnDefinitions>
<Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="21,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Grid.Column="1" Click="button1_Click" />
</Grid>
public partial class MainWindow : Window
{
ListView listView1 = new ListView();
GridViewColumn viewCol2 = new GridViewColumn();
public MainWindow()
{
InitializeComponent();
Style style = new Style(typeof(ListViewItem));
style.Setters.Add(new Setter(ListViewItem.HorizontalContentAlignmentProperty,
HorizontalAlignment.Stretch));
listView1.ItemContainerStyle = style;
GridView gridView1 = new GridView();
listView1.View = gridView1;
GridViewColumn viewCol1 = new GridViewColumn();
viewCol1.Header = "Option";
gridView1.Columns.Add(viewCol1);
viewCol2.Header = "Value";
gridView1.Columns.Add(viewCol2);
grid1.Children.Add(listView1);
viewCol1.DisplayMemberBinding = new Binding("Option");
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
}
private void button1_Click(object sender, RoutedEventArgs e)
{
DataTemplate dataTemplate = new DataTemplate();
FrameworkElementFactory spFactory = new FrameworkElementFactory(typeof(Grid));
Random random = new Random();
int cols = random.Next(1, 6);
int full = 100;
for (int i = 0; i < cols; i++)
{
FrameworkElementFactory col1 = new FrameworkElementFactory(typeof(ColumnDefinition));
int partWidth = random.Next(0, full);
full -= partWidth;
col1.SetValue(ColumnDefinition.WidthProperty, new GridLength(partWidth, GridUnitType.Star));
spFactory.AppendChild(col1);
}
if (full > 0)
{
FrameworkElementFactory col1 = new FrameworkElementFactory(typeof(ColumnDefinition));
col1.SetValue(ColumnDefinition.WidthProperty, new GridLength(full, GridUnitType.Star));
spFactory.AppendChild(col1);
}
for (int i = 0; i < cols; i++)
{
FrameworkElementFactory text1 = new FrameworkElementFactory(typeof(TextBlock));
SolidColorBrush sb1 = new SolidColorBrush();
switch (i)
{
case 0:
sb1.Color = Colors.Blue;
break;
case 1:
sb1.Color = Colors.Red;
break;
case 2:
sb1.Color = Colors.Yellow;
break;
case 3:
sb1.Color = Colors.Green;
break;
case 4:
sb1.Color = Colors.Purple;
break;
case 5:
sb1.Color = Colors.Pink;
break;
case 6:
sb1.Color = Colors.Brown;
break;
}
text1.SetValue(TextBlock.BackgroundProperty, sb1);
text1.SetValue(Grid.ColumnProperty, i);
spFactory.AppendChild(text1);
}
if (full > 0)
{
FrameworkElementFactory text1 = new FrameworkElementFactory(typeof(TextBlock));
SolidColorBrush sb1 = new SolidColorBrush(Colors.Black);
text1.SetValue(TextBlock.BackgroundProperty, sb1);
text1.SetValue(Grid.ColumnProperty, cols);
spFactory.AppendChild(text1);
}
dataTemplate.VisualTree = spFactory;
viewCol2.CellTemplate = dataTemplate;
int rows = listView1.Items.Count + 1;
listView1.Items.Add(new { Option = "Row " + rows });
}
}
<ListView ItemsSource="{Binding Data}">
<ListView.View>
<GridView>
<GridViewColumn DisplayMemberBinding="{Binding Name}" />
<GridViewColumn>
<GridViewColumn.CellTemplate>
<DataTemplate>
<!-- This should display your grid if it is a property on your item called GridProperty -->
<ContentControl Content="{Binding GridProperty}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>