wpf datagrid不显示数据,但显示行

时间:2015-12-14 19:08:14

标签: c# wpf xaml datagrid

我试图制作一个简单的WPF项目,但我遇到了一个问题: DataGrid绑定到ObservableCollection,它不显示 数据,但它显示正确的行数。看看它的外观

WPF DataGrid showing correct number of rows, but not showing data

这是XAML:

<Window x:Class="008.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:008"
        mc:Ignorable="d"
        Title="MainWindow">

    <StackPanel>
        <StackPanel Orientation="Horizontal" Margin="10">
            <Button Name="AddButton" HorizontalAlignment="Left"  Margin="10">Add an element</Button>
            <Button Name="DeleteOldButton" HorizontalAlignment="Left" Margin="10">Delete old files</Button>
            <Button Name="ShowPop" HorizontalAlignment="Left" Margin="10">Show most popular element</Button>
        </StackPanel>

        <DataGrid Name="dgrid" CanUserResizeColumns="True"
                  CanUserAddRows="False"
                  IsReadOnly="True"
                  DataContext="files"
                  ItemsSource="{Binding}"

                  Width="Auto">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
                <DataGridTextColumn Header="Date created" Binding="{Binding Created}"/>
                <DataGridTextColumn Header="Times Open" Binding="{Binding TimesOpen}"/>

            </DataGrid.Columns>
        </DataGrid>

    </StackPanel>
</Window>

以下是代码:

public partial class MainWindow : Window
    {
    ObservableCollection<File> files;

    public MainWindow()
    {

        InitializeComponent();
        files = new ObservableCollection<File>();
        files.Add(new File("r", DateTime.Now));
        files.Add(new File("o", DateTime.Now));
        files.Add(new File("a", DateTime.Now));
        files.Add(new File("d", DateTime.Now));

    }

}

我已经尝试过将Window DataContext设置为文件,但它没有工作

UPD:这是File类:

class File
    {
       public string Name { get; set; }
       public DateTime Created { get; set; }
       public int TimesOpen { get; set; }

        public File(string s, DateTime d)
        {
            Created = d;
            Name = s;
            TimesOpen = 0;
        }
        public void Open()
        {
            TimesOpen++;
        }
    }

UPD:已实施INotifyPropertyChanged。没有帮助。文件定义如下:

    class File: INotifyPropertyChanged 

    {
        public event PropertyChangedEventHandler PropertyChanged;
        private string name;
        public string Name
        {
            get { return name; }
            set
            {
                if (!value.Equals(name,StringComparison.InvariantCulture)) {
                    OnPropertyChanged("Name");
                    name = value;
                }                     
            }

        }
        private DateTime created;
       public DateTime Created
        {
            get { return created; }
            set
            {
                if (!created.Equals(value))
                {
                    OnPropertyChanged("Created");
                    created = value;
                }
            }
        }
        private int times_open;
       public int TimesOpen
        {
            get { return times_open; }
            set
            {
                if (times_open != value)
                {
                    OnPropertyChanged("TimesOpen");
                    times_open = value;
                }
            }
        }

        public File(string s, DateTime d)
        {
            Created = d;
            Name = s;
            TimesOpen = 0;
        }

        void OnPropertyChanged(string name)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(name));
            }
        }

        public void Open()
        {
            TimesOpen++;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

有些事情你做错了 - 您应该为窗口设置datacontext - 您的项目来源受文件限制。但是等等...... - 文件需要是datacontext中的属性,即主窗口
- 此外,您应该考虑在模型中实现INotifyPropertyChanged

<DataGrid Name="dgrid" CanUserResizeColumns="True"
        CanUserAddRows="False"
        IsReadOnly="True"
        ItemsSource="{Binding Files}"
        Width="Auto">

    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Date created" Binding="{Binding Created}"/>
        <DataGridTextColumn Header="Times Open" Binding="{Binding TimesOpen}"/>
    </DataGrid.Columns>
</DataGrid>

并在您的代码中使用

public partial class MainWindow : Window
{
    public ObservableCollection<File> Files {get; set;}


    public MainWindow()
    {

        InitializeComponent();
        DataContext = this;
        Files = new ObservableCollection<File>();
        Files.Add(new File("r", DateTime.Now));
        Files.Add(new File("o", DateTime.Now));
        Files.Add(new File("a", DateTime.Now));
        Files.Add(new File("d", DateTime.Now));
        Files.Add(new File("d", DateTime.Now));
        Files.Add(new File("d", DateTime.Now));
    }
}

答案 1 :(得分:0)

试试这个.. MainWindow.xaml.cs

public partial class MainWindow : Window
{
    public MainWindow()
    {

        InitializeComponent();
        Files = new ObservableCollection<File>();
        Files.Add(new File("r", DateTime.Now));
        Files.Add(new File("o", DateTime.Now));
        Files.Add(new File("a", DateTime.Now));
        Files.Add(new File("d", DateTime.Now));
        DataContext = this;
    }
}

public ObservableCollection<File> Files { get; set; }

MainWindow.xaml(摘要):

<DataGrid Name="dgrid" CanUserResizeColumns="True"
                  CanUserAddRows="False"
                  IsReadOnly="True"
                  ItemsSource="{Binding Files}"
                  Width="Auto">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Name" Binding="{Binding Name}"/>
        <DataGridTextColumn Header="Date created" Binding="{Binding Created}"/>
        <DataGridTextColumn Header="Times Open" Binding="{Binding TimesOpen}"/>
    </DataGrid.Columns>
</DataGrid>