【问题标题】:Adding data (not only text) to a multi column ListView (WPF)将数据(不仅是文本)添加到多列 ListView (WPF)
【发布时间】:2011-06-23 09:20:32
【问题描述】:

我正在使用 C# (.NET 4.0) 开发一个 WPF 应用程序,其中我有一个 ListView 和一个 GridView,它有两列。

我想动态地添加行(在代码中)。我的困境是只有第一列会添加常规文本。第二列将有一个对象,该对象包括一个带有 TextBlocks 的多列网格。 (见链接http://imageshack.us/photo/my-images/803/listview.png/

如果我按照您在所有列(即 DisplayMemberBinding)中输入文本时通常会执行的操作,我在第二列中得到的只是文本“System.Windows.Grid”,这显然不是我的想要。

如果我只是尝试使用代码 listView1.Items.Add(grid1)(不使用 DisplayMemberBinding)添加 Grid 对象(带有 TextBlocks)作为参考,则该对象仅添加到第二列(第一列是空白)而不是它通常如何处理相同文本在所有列中结束的文本。

我希望我的问题足够详细,如果能提供任何帮助,我们将不胜感激。

编辑:

我尝试了以下代码,但是每次单击按钮添加新行时,每一行都会使用相同的数据模板进行更新。 (即第二列总是在每一行显示相同的数据。)

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

    }
}

【问题讨论】:

    标签: c# wpf xaml listview


    【解决方案1】:

    您不必使用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>
    

    【讨论】:

    • 我实际上开始创建动态数据模板,但后来我发现每一行的第二列都使用创建的最新模板进行了更新。我不知道如何做到这一点,以便每行可以在第二列中显示不同的动态数据。
    • 您似乎不了解应该如何使用数据模板,每次单击按钮时您似乎都在重新创建数据模板,而您应该做的就是将数据添加到源集合然后通过静态数据模板将其转换为可视化表示。
    • 是的,这就是我正在做的。对不起,我是 WPF 的新手。问题是我相信我不能使用静态数据模板,因为其中的控件对于每一行都必须是动态的。那么解决我的问题的最佳方法是什么?看看上面的代码应该希望至少能暗示我正在努力完成什么。
    • 你可以用data templates做各种动态的事情,问题是你有什么样的数据。
    • 谢谢 H.B.感谢您的代码,我终于设法弄清楚了。 :)
    猜你喜欢
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多