2016-09-07 87 views
0

我有一个包含GridView的ListView的应用程序C#/ WPF。我想让内容创建一个包含所有值的CSV文件。获取GridView的内容

我做了一些研究,但我只找到窗体或WPF DataGrid的解决方案。没有GridView的。

我的列表:

<ListView Grid.Row="1" x:Name="myListView" 
      BorderBrush="White" HorizontalAlignment="Stretch" 
      ItemsSource="{Binding Path=myItem}" SelectedItem="{Binding Path=ActualItem}"> 
    <ListView.View> 
     <GridView x:Name="myGridView"> 

      <GridViewColumn Header="{x:Static p:Resources.NAME}" 
          DisplayMemberBinding="{Binding Path=Name,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}" 
          Width="{StaticResource doubleNaN}"/> 

      <GridViewColumn Header="{x:Static p:Resources.LABEL}" 
          DisplayMemberBinding="{Binding Path=Label,Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"/> 

     </GridView> 
    </ListView.View> 
</ListView> 

我能得到头,但没有内容:

System.Text.StringBuilder csv = new System.Text.StringBuilder();       
String separator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; 

foreach (System.Windows.Controls.GridViewColumn col in myGridView.Columns) 
{ 
    string header = col.Header as String; 
    if (!String.IsNullOrWhiteSpace(header)) 
    { 
     csv.Append(header + separator); 
    } 
} 
csv.AppendLine(); 

System.IO.File.WriteAllText(path, csv.ToString()); 

我怎样才能获得的内容,使我的CSV文件?

+2

你填充的东西叫做'myItem' ListView控件从对象的属性值。只需重复一遍即可。这就是内容所在的地方。另外,如果您想将内容添加到文件中,则必须编写这样的代码。您现在添加的是列标题。 –

+1

我可以得到'myItem'列表,但'GridView'不显示所有的属性。如果'myItem'中的所有元素都为null或空'NAME',我的'GridViewColumn'不显示(width = 0),用户也可以将宽度设置为0.为什么我想从'GridView'中获取值,得到只显示的值 –

+2

所以有一些你需要重现的微不足道的逻辑。所以重现它。 GridView的目的不是为CSV文件格式化值。试图以这种方式使用它是糟糕的设计。具体来说,用业务逻辑纠缠UI控件是WPF和MVVM发明很大的一个典型的反模式,以引导您远离。我很想赌这个代码在事件处理程序中。 –

回答

0

我找到了一个解决方案,可能不是最好的,但它的工作原理。

的问题是:

  • 从GridView中获得头,因为头靠语言

  • 只得到显示的列

项目在GridView控件是tyep MyItem和列包含属性。我创建了一个循环来获取来自GridView的标题和属性。第二个循环得到ListView

System.Text.StringBuilder csv = new System.Text.StringBuilder();       
String separator = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator; 
List<String> listProperties = new List<string>(); 

csv.AppendLine("sep=" + separator); 

foreach (System.Windows.Controls.GridViewColumn col in myGridView.Columns) 
{ 

    // Check if column is displayed 
    if (col.ActualWidth > 0) 
    { 
     // Get Header value 
     string header = col.Header as String; 

     //Check if Header is not empty 
     if (!String.IsNullOrWhiteSpace(header)) 
     { 
      // Write in firte line 
      csv.Append(header + separator); 

      // Get if columns is binding a property 
      System.Windows.Data.Binding binding = col.DisplayMemberBinding as System.Windows.Data.Binding; 
      if (binding != null) 
      { 
       // Get the name of property 
       listProperties.Add(binding.Path.Path); 
      } 
     } 
    } 
} 
// Write first line 
csv.AppendLine(); 

foreach (myItem item in myListView.Items) 
{ 
    foreach (String property in listProperties) 
    { 
     // Get and write value for property 
     object value = GetPropValue(item, property); 
     csv.Append(value + separator); 
    } 
    csv.AppendLine(); 
} 

System.IO.File.WriteAllText(path, csv.ToString()); 



public static object GetPropValue(object src, string propName) 
{ 
    return src.GetType().GetProperty(propName).GetValue(src, null); 
}