Добавление данных (а не только текста) в список столбцов ListView (WPF)

62
6

Я работаю над WPF-приложением на С# (.NET 4.0), где у меня есть ListView с GridView, который имеет два столбца.

Я динамически хочу добавлять строки (в код). Моя дилемма заключается в том, что в первый столбец будет добавлен обычный текст. Второй столбец будет иметь объект, который включает в себя многоколоночную сетку с TextBlocks. (см. ссылку http://imageshack.us/photo/my-images/803/listview.png/)

Если я делаю то, что вы обычно делаете, когда хотите вводить текст во всех столбцах (т.е. DisplayMemberBinding), все, что я получаю во втором столбце, это текст "System.Windows.Grid", который, очевидно, не является тем, что я хочу.

Для справки, если я просто попытаюсь добавить объект Grid (с помощью TextBlocks) с кодом listView1.Items.Add(grid1) (не используя DisplayMemberBinding), объект будет добавлен ко второму столбцу (первый столбец будет пустым) и а не как обычно работает с текстом, где один и тот же текст заканчивается во всех столбцах.

Надеюсь, мой вопрос будет достаточно подробным, и любая помощь в этом будет высоко оценена.

РЕДАКТИРОВАТЬ:

Я пробовал следующий код: howeever каждый раз, когда я нажимаю кнопку, чтобы добавить новую строку, каждая строка обновляется с помощью той же самой таблицы данных. (т.е. во втором столбце всегда отображаются одни и те же данные по каждой строке).

XAML:

<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 });

}
}

спросил(а) 2011-06-23T12:20:00+04:00 9 лет, 10 месяцев назад
1
Решение
122

Вам не нужно использовать DisplayMemberBinding, для сложного контента вы можете использовать CellTemplate, например:

<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>

ответил(а) 2011-06-23T16:19:00+04:00 9 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема