【问题标题】:WPF DataGrid adds rows but not the data (blank rows)WPF DataGrid 添加行但不添加数据(空白行)
【发布时间】:2015-02-25 05:38:13
【问题描述】:

好的,所以这很难解释。

场景:

我有一个 DataGrid 定义如下:

<DataGrid Height="100" Name="test" IsReadOnly="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="URL"></DataGridTextColumn>
        <DataGridTextColumn Header="PORT"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

它有两个标题,我需要添加数据,我做了很多研究建议使用 ObservableCollection,因为它会触发 DataChanged 事件。

我可以用可能不相关的冗长乏味代码来制定这些数据(您将在下面看到原因)。

问题:

添加了 200 行,但文本本身不在表格中

疑难解答:

我打开了调试,在屏幕截图的帮助下,你可以看到有实际数据,但它不会将它插入到行中,但它会添加行。

相关代码:

ObservableCollection<Proxy> collection = new ObservableCollection<Proxy>();
collection = GetData(ips,ports);
test.CanUserAddRows = true;
test.ItemsSource = null;
test.ItemsSource = collection;
MessageBox.Show("Done");

注意:我添加了 .ItemSource = null;然后将其设置为等于集合,因为这样可以显示行。我试过使用建议的:test.DataContext = collection; 但是,根本没有添加任何行,是的,就像这个测试一样,数据在调试模式下作为上下文/项目源的一部分是可见的。

更新:

我已尝试实现以下 XAML,结果相同

<DataGrid Height="100" Name="test" IsReadOnly="False" ItemsSource="{Binding collection}">
    <DataGrid.Columns>
        <DataGridTextColumn Header="URL" Binding="{Binding ip}"></DataGridTextColumn>
        <DataGridTextColumn Header="PORT" Binding="{Binding port}"></DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

代理类:

public class Proxy
{
    public string ip;
    public string port;
}

更新 2: 添加 get 和 set 方法时,我的结果如下:

【问题讨论】:

  • 你在哪里告诉你的应用程序在列中写入什么?您只需设置 itemssource(如果您问我,您应该在 xaml 中做什么)
  • 嗨,你能解释一下吗?您的意思是在 XAML 中创建 DataBindings 吗?
  • 您的 DataGridTextColumn 中没有绑定,因此它们不显示任何数据。
  • @PhilipStuyck,如果我有一个 ObservableCollection,我将如何绑定到它还是必须拆分它?
  • 已经有 2 个答案大部分重叠。您必须绑定到您的代理成员。您还可以尝试使用 AutogenerateColumns = true。只是为了确保有数据。

标签: c# wpf datagridview rows


【解决方案1】:

您缺少为绑定定义属性:至少,像这样更改代理类:

public class Proxy
{
    public string ip {get; set;}
    public string port {get; set;}
}

【讨论】:

  • 哇,这很有趣。看看我更新的问题,那种工作。
  • 如果你有明确的绑定,也许你可以删除自动生成的列
  • 宾果游戏,不得不强制它为假。
  • 其实这只是一个开始,因为您需要在 Proxy 类上实现 INotifyPropertyChanged。 user3596113 的回答更完整,应该可以工作。
  • 如果这些属性的唯一更改来自该数据网格,则无需通知。如果您必须反映来自数据网格本身以外的其他来源的更新,那么这是不完整的。
【解决方案2】:

您的列没有绑定。这是一个如何做的例子:

<DataGrid x:Name="RelatieSearchGrid" AutoGenerateColumns="False" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
                       ItemsSource="{Binding Relaties.View}" IsReadOnly="True"   
                       SelectionMode="Single">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Naam" Binding="{Binding Naam}"/>
            <DataGridTextColumn Header="Straat" Binding="{Binding Straat}"/>
            <DataGridTextColumn Header="Postcode" Binding="{Binding Postcode}"/>
            <DataGridTextColumn Header="Gemeente" Binding="{Binding Gemeente}"/>
            <DataGridTextColumn Header="BTW" Binding="{Binding BTW}"/>
        </DataGrid.Columns>
    </DataGrid>

在您的情况下,由于集合包含代理,您需要绑定到代理成员。您没有显示代理代码,所以我只能猜测这些成员是什么。 如果您想通过数据上下文,那么您需要使用视图模型。在这种情况下,我建议您先阅读一些有关 MVVM 的内容。

【讨论】:

  • 嗨,我想我已经开始实施你在这里的建议了,检查我更新的问题。或者我可能完全不在这儿了
  • 您的绑定必须包含要代理的确切成员名称,即 ip 和端口,而不是 Url 和端口。绑定区分大小写!!
  • 抱歉,我已经更新了问题并更新了我的 xaml,但遗憾的是没有任何变化。
  • 先试试这个 AutoGenerateColumns="True"
【解决方案3】:

您应该首先在 xaml 中设置 ItemsSource:

<DataGrid ItemsSource="{Binding test}" ... >

然后你应该像这样添加你的 TemplateColumns:

<DataGrid ItemsSource="{Binding test}" ...>
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Url}"
                                            Header="URL" />
        <DataGridTextColumn Binding="{Binding Port}"
                                            Header="Port" />
    </DataGrid.Columns>
</DataGrid>

请注意,这将需要存储在 ObservableCollection test 中的对象具有 Url 和 Port Porperty。

更改您的模型类以实现 INPC 并像这样调整您的属性:

public class Proxy : INPC
{
    public String Url
    {
        get
        {
            return url;
        }
        set
        {
            if (url== value) {
                return;
            }
            url= value;
            RaisePropertyChanged("Url");
        }
    }
    private string url;

    public String Port
    {
        get
        {
            return port;
        }
        set
        {
            if (port== value) {
                return;
            }
            port= value;
            RaisePropertyChanged("Port");
        }
    }
    private string port;
}

【讨论】:

  • 嗨,好的,我试了一下,但没有产生不同的结果,请查看我更新的问题。
  • 你看我最后一句话了吗?运行时输出窗口中是否有任何绑定错误?
  • System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“代理”(HashCode=6855507)上找不到“ip”属性。绑定表达式:路径=ip; DataItem='代理' (HashCode=6855507);目标元素是'TextBlock'(名称='');目标属性是“文本”(类型“字符串”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”上找不到“端口”属性“代理是的,我愿意
  • 请显示存储在您的 ObservableCollection 中的模型类。
  • 您需要将属性重命名为 Url 和 Port。或者您需要更改您的 xaml 代码。你的模型类也应该实现 INPC。或许你应该先阅读一些关于 WPF 和 MVVM 的知识。
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-04-06
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多