C# 在C中读写ListView的简单方法?

C# 在C中读写ListView的简单方法?,c#,wpf,file,listview,io,C#,Wpf,File,Listview,Io,是否有一种简单/标准的方法可以将文件读入listview并将其保存到文件中?我真的不在乎它是TXT文件、XAML文件还是二进制文件。这并不重要,我也没有那么多数据 以下是存储在每个数据库中的列和数据 public class LVData { public string Name { get; set; } public string YoungPic { get; set; } public string MediumPic {

是否有一种简单/标准的方法可以将文件读入listview并将其保存到文件中?我真的不在乎它是TXT文件、XAML文件还是二进制文件。这并不重要,我也没有那么多数据

以下是存储在每个数据库中的列和数据

    public class LVData
    {
        public string Name { get; set; }
        public string YoungPic { get; set; }
        public string MediumPic { get; set; }
        public string AdultPic { get; set; }
        public bool SaltWater { get; set; }
        public bool FreshWater { get; set; }
        public bool Grasslands { get; set; }
        public bool Swamp { get; set; }
        public bool TropicalForrest { get; set; }
        public bool Forest { get; set; }
        public bool ForestEdge { get; set; }
        public bool Sand { get; set; }
        public bool Coastal { get; set; }
        public bool RiverBorder { get; set; }
        public bool LakeBorder { get; set; }
        public bool Floodplain { get; set; }
    }
我的listview名为listView1

以及XAML:

<Window x:Class="DinosaurIsland.PlantDisplay"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:DinosaurIsland"
Title="Vegetation" Height="308" Width="1212" WindowStyle="SingleBorderWindow"
DataContext="{Binding RelativeSource={RelativeSource Self}}" Loaded="Window_Loaded">
<Window.Resources>
    <DataTemplate x:Key="YoungPicCell">
        <StackPanel Orientation="Horizontal">
            <Image Height="200" Width="200" Stretch="None" Source="{Binding YoungPic}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="MediumPicCell">
        <StackPanel Orientation="Horizontal">
            <Image Height="200" Width="200" Stretch="None" Source="{Binding MediumPic}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="AdultPicCell">
        <StackPanel Orientation="Horizontal">
            <Image Height="200" Width="200" Stretch="None" Source="{Binding AdultPic}" />
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="TerrainCell">
        <StackPanel Orientation="Vertical">
            <CheckBox Content="Salt Water"  Name="SaltWaterCheckbox" IsThreeState="False" IsChecked="{Binding Saltwater}" />
            <CheckBox Content="Fresh Water"  Name="FreshWaterCheckbox" IsThreeState="False" IsChecked="{Binding Freshwater}" />
            <CheckBox Content="Grassland / Plains"  Name="GrasslandsCheckbox" IsThreeState="False"  IsChecked="{Binding Grassland}" />
            <CheckBox Content="Swamp"  Name="SwampCheckbox" IsThreeState="False" IsChecked="{Binding Swamp}" />
            <CheckBox Content="Tropical Forest"  Name="TropicalForestCheckbox" IsThreeState="False"  IsChecked="{Binding TropicalForest}" />
            <CheckBox Content="Forest"  Name="ForestCheckbox" IsThreeState="False" IsChecked="{Binding Forest}" />
            <CheckBox Content="Forest Edge"  Name="ForestEdgeCheckbox" IsThreeState="False"  IsChecked="{Binding ForestEdge}" />
            <CheckBox Content="Sand"  Name="SandCheckbox" IsThreeState="False" IsChecked="{Binding Sand}" />
            <CheckBox Content="Coastal"  Name="CoastalCheckbox" IsThreeState="False" IsChecked="{Binding Coastal}" />
            <CheckBox Content="River Border"  Name="RiverBorderCheckbox" IsThreeState="False" IsChecked="{Binding RiverBorder}" />
            <CheckBox Content="LakeBorder"  Name="LakeBorderCheckbox" IsThreeState="False"  IsChecked="{Binding LakeBorder}" />
            <CheckBox Content="Floodplain"  Name="FloodplainCheckbox" IsThreeState="False"  IsChecked="{Binding Floodplain}" />
        </StackPanel>
    </DataTemplate>

    <DataTemplate x:Key="PlacePlantsCell">
        <StackPanel Orientation="Vertical">
            <Label Margin="10"  Content="Random" HorizontalAlignment="Center" ></Label>
            <Slider Margin="10"  Width="190" Value="50" Orientation="Horizontal" HorizontalAlignment="Center" IsSnapToTickEnabled="True" Maximum="100" TickPlacement="BottomRight"  TickFrequency="5"> </Slider>
            <Button Margin="10"  Content="Randomly Seed Plants" HorizontalAlignment="Center"  Height="23" Name="SeedButton" ></Button>
        </StackPanel>
    </DataTemplate>
</Window.Resources>

<DockPanel>
    <Grid>
        <ListView Name="listView1">
            <ListView.View>
                <GridView>
                    <GridViewColumn Width="152" Header="Name" DisplayMemberBinding="{Binding Name}" />
                    <GridViewColumn Width="202" Header="Picture of Young Plant" CellTemplate="{StaticResource YoungPicCell}" />
                    <GridViewColumn Width="202" Header="Picture of Medium Plant" CellTemplate="{StaticResource MediumPicCell}" />
                    <GridViewColumn Width="202" Header="Picture of Adult Plant" CellTemplate="{StaticResource AdultPicCell}" />
                    <GridViewColumn Width="202" Header="Terrain / Environments" CellTemplate="{StaticResource TerrainCell}" />
                    <GridViewColumn Width="202" Header="Place Plants" CellTemplate="{StaticResource PlacePlantsCell}" />
                </GridView>
            </ListView.View>
        </ListView>
        <Button Content="New Plant"  DockPanel.Dock="Bottom"  Height="23" HorizontalAlignment="Left" Margin="160,240,0,0" Name="NewPlant" VerticalAlignment="Top" Width="75" Click="NewPlant_Click" />
        <Button Content="Save" DockPanel.Dock="Bottom"   Height="23" HorizontalAlignment="Center" Margin="1099,240,15,0" Name="SavePlant" VerticalAlignment="Top" Width="75" Click="SavePlant_Click"/>
        <Button Content="Load" Height="23" HorizontalAlignment="Left" Margin="26,240,0,0" Name="LoadPlants" VerticalAlignment="Top"  Click="LoadPlants_Click" Width="75" /> 
    </Grid>
</DockPanel>
下面是整个表单/对话框/列表视图的图片,不管它叫什么:


自从使用这个屏幕上限后,我还添加了一个“加载”按钮。

我编写了一个小项目,从XML读取数据并在列表视图中显示

下面是示例XML文件

<?xml version="1.0" encoding="utf-8"?>
<Persons>
  <Person>
    <Name>Dave</Name>
    <YoungPic>Picture1</YoungPic>
    <MediumPic>Picture2</MediumPic>
    <AdultPic>Picture3</AdultPic>
    <Terrain>1</Terrain>
  </Person>
  <Person>
    <Name>Rachael</Name>
    <YoungPic>Picture1</YoungPic>
    <MediumPic>Picture2</MediumPic>
    <AdultPic>Picture3</AdultPic>
    <Terrain>2</Terrain>
  </Person>
</Persons>
然后在同一项目名称空间中添加以下两个类-Viewmodel和lsvData

public class LVData
    {
        public string Name { get; set; }
        public string YoungPic { get; set; }
        public string MediumPic { get; set; }
        public string AdultPic { get; set; }
        public byte Terrain { get; set; }
    }
    public class WindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        //called when a property is changed
        protected void RaisePropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }

        private ObservableCollection<LVData> _personList = new ObservableCollection<LVData>();
        public ObservableCollection<LVData> lsvData
        {
            get { return _personList; }
            set { _personList = value; RaisePropertyChanged("lsvData"); }
        }

        public void PopulateDataFromXML()
        {
            XDocument loaded = XDocument.Load(@"c:\documents and settings\bjasti\my documents\visual studio 2010\Projects\lvs\lvs\data.xml");

            var Persons = from x in loaded.Descendants("Person")
                          select new
                          {
                              Name = x.Descendants("Name").First().Value,
                              YoungPic = x.Descendants("YoungPic").First().Value,
                              MediumPic = x.Descendants("MediumPic").First().Value,
                              AdultPic = x.Descendants("AdultPic").First().Value,
                              Terrain = x.Descendants("Terrain").First().Value
                          };
            foreach (var _person in Persons)
            {
                _personList.Add(new LVData { Name = _person.Name, YoungPic = _person.YoungPic, MediumPic = _person.MediumPic, AdultPic = _person.AdultPic, Terrain = Convert.ToByte(_person.Terrain) });
            }

            RaisePropertyChanged("lsvData");
        }

    }

检查此解决方案并让我知道它是否有效

您可以直接绑定到xml文件:这样您就不必手动将其复制到您的文件中,您只需保存此文件。什么??你的问题完全不清楚。是的,您可以将数据存储在任何您想要的数据存储中,而这本身与WPF或任何表示层/UI元素/任何内容都没有任何关系。很抱歉不清楚。我感到困惑的是,如何将listview中的每个项目写入一个文件,然后将其读回?是否有一种“标准”的方法来做到这一点?我想我可以将每一行作为字符串转储到一个txt文件中,然后反转加载过程。我在找更优雅的东西。找不到这样做的示例或任何迹象。第一:感谢所有帮助!我快拿到了。我不得不更改地形数据。它现在是一系列复选框的布尔:公共类LVData{-snip-public bool SaltWater{get;set;}公共布尔淡水{get;set;}公共布尔草地{get;set;}公共布尔沼泽{get;set;}公共布尔热带雨林{get;set;}public bool-Forest{get;set;}public bool-ForestEdge{get;set;}-etc.-}这将如何更改您的代码?复选框是否相互排斥?不,复选框不是相互排斥的。这些是针对植物的,植物的“类型”可以在不同的地形中。您可以为每个工厂检查任意多个地形类型。仅供参考:这里有一个指向整个项目的链接:如何从XAML设置复选框?如何绑定所有地形类型复选框?此外,现在显示的是图像名称的文件字符串,而不是图像。我需要改变什么?
public partial class MainWindow : Window
    {
        private WindowViewModel _wvm;
        public MainWindow()
        {
            InitializeComponent();
            _wvm = new WindowViewModel();
            this.DataContext = _wvm;
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            _wvm.PopulateData();
        }
    }
public class LVData
    {
        public string Name { get; set; }
        public string YoungPic { get; set; }
        public string MediumPic { get; set; }
        public string AdultPic { get; set; }
        public byte Terrain { get; set; }
    }
    public class WindowViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        //called when a property is changed
        protected void RaisePropertyChanged(string PropertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
            }
        }

        private ObservableCollection<LVData> _personList = new ObservableCollection<LVData>();
        public ObservableCollection<LVData> lsvData
        {
            get { return _personList; }
            set { _personList = value; RaisePropertyChanged("lsvData"); }
        }

        public void PopulateDataFromXML()
        {
            XDocument loaded = XDocument.Load(@"c:\documents and settings\bjasti\my documents\visual studio 2010\Projects\lvs\lvs\data.xml");

            var Persons = from x in loaded.Descendants("Person")
                          select new
                          {
                              Name = x.Descendants("Name").First().Value,
                              YoungPic = x.Descendants("YoungPic").First().Value,
                              MediumPic = x.Descendants("MediumPic").First().Value,
                              AdultPic = x.Descendants("AdultPic").First().Value,
                              Terrain = x.Descendants("Terrain").First().Value
                          };
            foreach (var _person in Persons)
            {
                _personList.Add(new LVData { Name = _person.Name, YoungPic = _person.YoungPic, MediumPic = _person.MediumPic, AdultPic = _person.AdultPic, Terrain = Convert.ToByte(_person.Terrain) });
            }

            RaisePropertyChanged("lsvData");
        }

    }