【问题标题】:Why isn't my WPF datagrid being populated?为什么没有填充我的 WPF 数据网格?
【发布时间】:2014-07-20 07:31:03
【问题描述】:

我在这里学习教程:http://www.wpf-tutorial.com/datagrid-control/introduction/

我设置了 DataGrid,使用数据源创建了一个集合,并将 DataGrid 的 ItemsSource 设置为该集合。运行程序后,似乎行数是正确的,但所有行都是空白的。我需要进行哪些更改才能使数据正确显示?

xaml:

<Window x:Class="Task_Timer.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Task Timer" Height="284" Width="598" MinWidth="500" MinHeight="400">
    <Grid Margin="10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <DataGrid x:Name="ProcessBox" Margin="0" SelectionMode="Extended" ScrollViewer.HorizontalScrollBarVisibility="Hidden" GridLinesVisibility="None" AutoGenerateColumns="False" IsManipulationEnabled="True" IsReadOnly="True" HorizontalAlignment="Left" Width="285">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Process" Binding="{Binding ProcessName}" />
                <DataGridTextColumn Header="Memory" Binding="{Binding Memory}" />
            </DataGrid.Columns>
        </DataGrid>
        <Button Content="Button" Grid.Column="1" HorizontalAlignment="Left" Margin="10,0,0,0" VerticalAlignment="Top" Width="75"/>
    </Grid>
</Window>

C#:

namespace Task_Timer
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            List<ProcessContainer> items = new List<ProcessContainer>();
            foreach (Process process in Process.GetProcesses())
            {
                items.Add(new ProcessContainer(process.ProcessName, 10));
            }

            ProcessBox.ItemsSource = items;
        }
    }

    public class ProcessContainer
    {
        public string ProcessName;
        public int Memory;

        public ProcessContainer(string name, int memory)
        {
            ProcessName = name;
            Memory = memory;
        }
    }

}

【问题讨论】:

    标签: c# wpf datagridview


    【解决方案1】:

    您缺少 getset。您需要在 ProcessContainer

    类中设置属性的值

    改成这样,

    public class ProcessContainer
            {
                public string ProcessName {get;set;}
                public int Memory { get; set; }
    
                public ProcessContainer(string name, int memory)
                {
                    ProcessName = name;
                    Memory = memory;
                }
            }
    

    【讨论】:

    • 有趣。我一直认为 get 和 set 是隐含的。无论如何工作,谢谢!
    • 这个答案可能会误导其他人的实际原因。实际上只有 properties 可以用于绑定,fields 不能(更不用说用户的其他不好的东西了)代码)。
    • @KingKing 是对我的代码或此答案中代码的引用的“坏事”?
    • @ssb 当然它在你的代码中。比如你应该使用ObservableCollection而不是List(一个简单的List不支持通知属性改变以及通知集合改变)。此外,还应通过为您的 ViewModel 实现 INotifyPropertyChanged 接口来通知您 ViewModel 中的属性的更改。这完全是关于编程模式,尤其是应该在 WPF 应用程序中使用的 MVVM。但是,如果您的 DataGrid 应该只显示数据,那也没关系。
    • @KingKing 真幸运,我学到了这个艰难的方法,并经历了相当长的磨难来修复它!无论如何,如果您在我的(或其他人的)代码中看到不好的东西,我认为称它为不好是可以的,但我希望您至少可以提及原因。否则你可能会为我节省一个小时。我完全承认我完全不知道应该如何正确使用 WPF。
    【解决方案2】:

    如下更改您的 ProcessContainer 类

     public class ProcessContainer
        {
            private string process;
    
            public string ProcessName
            {
                get { return process; }
                set { process = value; }
            }
    
            private int memory;
    
            public int Memory
            {
                get { return memory; }
                set { memory = value; }
            }
    
    
            public ProcessContainer(string name, int memory)
            {
                ProcessName = name;
                Memory = memory;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多