Добавление данных (не только текста) в многостолбцовый ListView (WPF) - PullRequest
1 голос
/ 23 июня 2011

Я работаю над приложением WPF в C # (.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)объект добавляется только во второй столбец (с первым пустым столбцом), а не как он обычно работает с текстом, где одинаковый текст заканчивается во всех столбцах.

Я надеюсь, что мой вопрос достаточно подробный и поможетс этим будет очень признателен.

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

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

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

    }
}

1 Ответ

0 голосов
/ 23 июня 2011

Вам не нужно использовать 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...