【问题标题】:WPF Add listview item in listview created dynamicallyWPF在动态创建的listview中添加listview项
【发布时间】:2017-11-14 03:31:14
【问题描述】:

这是我的第一个问题:)

我在 Window_Loaded() 中从文本文件中创建了一个列表视图列 在此之后,我想将项目添加到此列表视图中...

foreach (KeyValuePair<string, string> key in App.sysIni.monitorProperties)
            {

                GridViewColumn column = new GridViewColumn();
                column.Header = key.Value;
                column.Width = 70;
                GridViewControlMonitor.Columns.Add(column);
}    

在此之后我创建列表视图项:

string[] rowItems = new string[list.Count];

for (int i = 1; i < list.Count; i++)
    {
    rowItems[i] = list[i];
    }
 var item = new ListViewItem { Content = rowItems};
 itemsList.Add(item);

并在列表视图中添加此项:

   RequestMonitorListV.Items.Add(item);

我的列表视图填充的是“String[] Array”而不是值...

是否可以创建一个包含内容的列表视图项以及对该内容的某种绑定?

var item = new ListViewItem { Content = rowItems, !!soomeBindingOptinos!!};

有人可以帮我解决这个问题吗?

提前谢谢你

【问题讨论】:

标签: c# wpf visual-studio data-binding


【解决方案1】:

您应该将每个GridViewColumnDisplayMemberBinding 属性绑定到ListViewItemsSource 集合中对象的属性:

for (int i = 0; i<App.sysIni.monitorProperties.Count; ++i)
{
    KeyValuePair<string, string> key = App.sysIni.monitorProperties[i];
    GridViewColumn column = new GridViewColumn();
    column.Header = key.Value;
    column.Width = 70;
    column.DisplayMemberBinding = new Binding("[" + i + "]");
    GridViewControlMonitor.Columns.Add(column);
}

...并将后者设置为IEnumerable,例如string[]

string[] rowItems = new string[list.Count];
for (int i = 0; i<list.Count; i++)
{
    rowItems[i] = list[i];
}
RequestMonitorListV.ItemsSource = rowItems;

【讨论】:

    【解决方案2】:

    我将专注于您的代码的第二部分,因为这似乎是实际造成问题的部分。不幸的是,缺少一些细节,所以我将对意图、类型等做出一些假设。

    这是我将要处理的 .xaml:

    <Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ListView x:Name="myListView" HorizontalAlignment="Left" Height="301" Margin="10,10,0,0" VerticalAlignment="Top" Width="498">
            <ListView.View>
                <GridView>
                    <GridViewColumn/>
                </GridView>
            </ListView.View>
        </ListView>
    
    </Grid>
    </Window>
    

    这是我对那段 C# 的解释:

    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApp1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                var myListViewVar = this.FindName("myListView") as ListView;
    
                string[] rowItems = new string[10];
    
                for (int i = 0; i < 10; i++)
                {
                    rowItems[i] = i.ToString();
                }
                var item = new ListViewItem { Content = rowItems };//You are adding your string array to a singular element. It does not want it. It wants a nice string.
                var itemsList = new List<ListViewItem>();//You then wrap this singular item in a list. I'm inferring the type here, since the rest of your code does not reference it.
                itemsList.Add(item);
    
                myListViewVar.Items.Add(item);//You then add the ARRAY to the list of items. Again, this is not desired. See https://msdn.microsoft.com/en-us/library/system.windows.forms.listview.items(v=vs.110).aspx for usage examples.
            }
        }
    }
    

    如上所述,WPF 不知道如何对数组进行字符串化。从其余代码的含义解释,我认为您想要的是:

    using System.Collections.Generic;
    using System.Windows;
    using System.Windows.Controls;
    
    namespace WpfApp1
    {
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
                var myListViewVar = this.FindName("myListView") as ListView;
    
                string[] rowItems = new string[10];
    
                for (int i = 0; i < 10; i++)
                {
                    rowItems[i] = i.ToString();
                }
    
                for (int i = 0; i < 10; i++)
                {
                    var item = new ListViewItem { Content = rowItems[i] };//Each ListViewItem holds an individual string rather than an array
                    myListViewVar.Items.Add(item);//Then add that ListViewItem.
                }
            }
        }
    }
    

    显然,这在第二个循环的形式中存在冗余,但我想保留您的代码,将所有内容存储在循环之外。

    至于数据绑定,我建议查看WPF Binding to local variable 我不经常使用 WPF,但它看起来像你想要的。

    希望这会有所帮助。如果我错过了您的意图,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多