2017-06-12 105 views
-1

这是我第一次在这里)的问题:)列表视图中添加WPF ListView项创建动态

我创建一个列表视图的列形成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 []数组”没有价值......

可以创建内容的列表视图项和某种为内容绑定?

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

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

预先感谢您

+0

[C#listView,如何将项目添加到列2,3和4等?](https:// stackoverflow。com/questions/473148/c-sharp-listview-how-do-i-add-items-to-columns-2-3-and-4-etc) – Sean

+1

将ObservableCollection 绑定到XAML中Your Items属性的Items ,然后在阅读文本文件时添加项目。您可能需要使用调度程序调用UI线程... – Chrisi

回答

0

我要关注的是对代码的第二部分,因为这似乎是,实际上造成麻烦的部分。不幸的是一些细节丢失,所以我会在意图,类型进行一些假设,等

这里是我的.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过于频繁,但它看起来像你想要什么。

希望这会有所帮助。让我知道,如果我错过了你打算的标记。

+0

您的示例非常好,并且可以正常工作。谢谢 –

0

你应该每个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; 
+0

谢谢,在我的项目中工作正常 –

+0

不客气,但请记住接受答案:https://meta.stackexchange.com/questions/23138/how-to-accept-the-answer-on -堆栈溢出 – mm8