我一直在尝试使用数据绑定和文件IO概念进行操作,为此,我编写了一个简单的应用程序,该应用程序读取2列5行.csv文件,并将内容显示到WPF中的Listview中,并具有可以更改我的Listview中第二列的值(例如2向绑定)。

我没有任何信息可以显示在我的窗口中。 我只得到我在MainWindow.xaml中定义的列标题,但没有任何数据绑定有效。

这是我的视图模型和读取文件的代码

namespace WpfPreview
{

public class LoadMovieData : BindableObject // My Data Context?
{
    public string MovieName { get; set; }
    private double year; public double Year { get { return year; } set { year = value; RaisePropertyChanged("Year"); } }
}


class ViewModel : BindableObject
{
    private List<LoadMovieData> obsMovies = new List<LoadMovieData>();
    public List<LoadMovieData> ObsMovies
    {
        get { return obsMovies; }
        set { obsMovies = value; RaisePropertyChanged("ObsMovies"); }
    }



    public void ReadFile()
    {

            string filepath = System.IO.Path.Combine("C:\\Users\\Param\\Desktop", "excel.csv"); // Get filepath

            using (var csvReader = new StreamReader(filepath)) // using this filepath
            {
                csvReader.ReadLine();       // read first line (headers)
                csvReader.ReadLine();       // read first line of row data

                while (!csvReader.EndOfStream) // while not end of file
                {
                    var words = csvReader.ReadLine().Split(',').ToList(); // read line to list of columns
                    var x = new LoadMovieData()  // new instance of data class
                    {
                        MovieName = words[0],
                        Year = Convert.ToDouble(words[1])
                    };

                    ObsMovies.Add(x); // add instance of data class to list variable

                }
            }

        }

    }
}

我不确定我的说法是否正确。 我正在尝试遵循MVVM模式。 我在窗口后面的代码是这样的:

namespace WpfPreview
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}
}

这是我的XAML部分:

<Window x:Class="WpfPreview.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:me="clr-namespace:WpfPreview"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Border Background="White">

        <ListView x:Name="MovieListView" ItemsSource="{Binding Path=ObsMovies}" VirtualizingStackPanel.IsVirtualizing="True" Background="Transparent">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="Movie Name">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Grid>
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition />
                                    </Grid.ColumnDefinitions>
                                    <TextBlock Text="{Binding ObsMovies.MovieName}" />
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                    <GridViewColumn Header="Year" Width="60">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <Grid>
                                    <TextBlock Text="{Binding ObsMovies.Year}" />
                                </Grid>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>
                </GridView>
            </ListView.View>
        </ListView>
    </Border>
</Grid>

我对使用文件IO和数据绑定/数据上下文非常陌生。 我确信某个地方有一个明显的错误,并且我想做的事情可以以更容易/更简单的方式完成。 请随时给我建议以重组我的代码。

===============>>#1 票数:2 已采纳

我通常将数据加载代码放入ViewModel构造函数中。 另外,我相信没有访问修饰符,您的ViewModel类是私有的,因此您将无法从该类外部调用任何东西。 考虑public

看来您的obsMovies列表应该是ObservableCollection obsMovies的值实现PropertyChanged通知,但是如果向其中添加一个项目,则该集合不会通知UI其集合已更改。

更改此:

private List<LoadMovieData> obsMovies = new List<LoadMovieData>();
public List<LoadMovieData> ObsMovies
{
    get { return obsMovies; }
    set { obsMovies = value; RaisePropertyChanged("ObsMovies"); }
}

对此:

private ObservableCollection<LoadMovieData> obsMovies = new ObservableCollection<LoadMovieData>();
public ObservableCollection<LoadMovieData> ObsMovies
{
    get { return obsMovies; }
    set { obsMovies = value; RaisePropertyChanged("ObsMovies"); }
}

您必须导入System.Collections.ObjectModel才能使用它。

另外,看起来您的绑定可能不太正确。 尝试改用以下内容:

 <ListView.View>
     <GridView>
        <GridViewColumn Header="Movie Name">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding ObsMovies.MovieName}" />
                    </Grid>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
        <GridViewColumn Header="Year" Width="60">
            <GridViewColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <TextBlock Text="{Binding ObsMovies.Year}" />
                    </Grid>
                </DataTemplate>
            </GridViewColumn.CellTemplate>
        </GridViewColumn>
    </GridView>
</ListView.View>

上面的绑定在TextBlock绑定中省略了ObsMovies。 由于DataContext的每一行都是集合中的项目之一,因此无需在绑定中引用集合。 只是使绑定路径从数据上下文级别开始(在本例中为ObsMovies)。

最后,如所承诺的,DataGrid的示例实现:

<DataGrid HorizontalAlignment="Left" VerticalAlignment="Top" ItemsSource="{Binding ObsMovies}">
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Year}" ClipboardContentBinding="{x:Null}" Header="Year"/>
        <DataGridTextColumn Binding="{Binding MovieName}" ClipboardContentBinding="{x:Null}" Header="Movie Name"/>
    </DataGrid.Columns>
</DataGrid>

若要具有允许编辑项目的文本框,在listView示例中,将TextBlocks替换为TextBoxes,对于DataGrid,指定一个DataGridTemplateColumn并将一个TextBox放在模板中:

<DataGridTemplateColumn ClipboardContentBinding="{x:Null}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Property}"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

  ask by Karanveer Plaha translate from so

未解决问题?本站智能推荐:

2回复

将数据附加到文件时更新Listview?

这是我正在做的事情:我正在将消息和日期时间记录到成功完成的文本文件中。 现在,我想将其添加到Listview(或可用于实现此目的的任何其他控件)中,并且在文件更新时也应更新Listview。 我是C#的新手,请原谅我缺乏知识。
3回复

在WPF列表视图中显示图像

我想在列表视图中显示图像,但是我不知道该怎么做。 我的Guest类具有方法GetGuestImage()它为我返回了绝对路径。 当该文件存在时,应加载该文件,而在不存在时,应加载一个占位符图像。 我怎么能意识到这一点?
1回复

文字未显示在我的列表视图中

显然我做错了,因为我以前以这种方式使用过这种类型的控件。 我的文本未显示在列表视图中。 我可以双击该项目并获取其值,但看不到它。 您可能会认为这将是一个简单的样式设置,并且可能已在我的appp.xaml中的其他位置进行了设置,但事实并非如此。 这是我的标记: 我后面的代码
1回复

尝试返回列表视图中的第一列值

我试图返回列表视图中的第一列DriverListView : 但我得到的是: 到目前为止,这是我的代码: 列表显示: 可能出什么问题了? 它似乎在返回对象而不是文本值,这是不正确的。
2回复

在列表视图中更改选择突出显示颜色

我该怎么做呢? 我发现的所有内容都表明这应该可行,但对我而言不行。 我究竟做错了什么?
1回复

WPF MVVM:按列表视图中显示的成员筛选

我有一个listview内的gridview。 模型中有一列“部门”(Department)绑定到属性“部门”(Department),并且还关联了对流器。 Converter获取来自属性的值,并以另一种形式(带有另一个字符串)显示它。 例如,如果此属性“部门”的值在列中显示为“
2回复

在列表视图中显示字典中的值,而不是缩写

我有一个ListView ,其中显示实体的集合。 这些列之一包含一个缩写,我想显示另一个文本。 我在字典中既有缩写也有'display'-string。 有什么方法可以显示字典中的显示字符串而不是缩写,而无需更改实体?
1回复

无法在列表视图中显示图片

您好,我在列表视图中显示图片时遇到问题。 我有一个网址数组,必须从中下载图片,但是出于测试目的,我尝试使用本地硬盘中的同一图片填充每一行。 我可以绑定数据,但是到目前为止,我只能打印到图片列的唯一对象是对象的名称,而不是图片本身(DisplayData.Image),这是我的xaml和c#代
1回复

WPF-用绑定的XML突出显示列表视图中的行

首先,我为我的英语不好而道歉。 我已将xml绑定到一个listview,其中每一行代表一个人。 我希望行的背景颜色是蓝色还是粉红色,具体取决于xml中的sex元素。 我已经使用触发器创建了样式,但是它们似乎仅检查第一个xml节点,并且所有行的颜色与第一行相同。 男性Xml元素性别为0
1回复

如何从列表视图中获取selecteditems属性

我创建了一个列表视图,其中项目按不同类别排序。 我试图获取列表视图的selectedItem进入我的Viewmodel中的属性,我遵循常规方法,只是将绑定设置为SelectedItem属性。 但是,由于我现在实际上仅将datacontext设置为我的可观察集合,并且没有触及ItemsSo