WPF DataGrid添加行但不添加数据(空行)

时间:2015-02-25 05:38:14

标签: c# wpf datagridview rows

好的,所以这很难解释。

情景:

我有一个DataGrid定义如下:

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

data grid visual

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

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

问题:

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

blank rows

疑难解答:

我打开了调试功能并通过屏幕截图帮助,您可以看到有实际数据,但不会将其插入行中,但会添加行。

Data Collection

相关代码:

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; 但是,根本没有添加任何行,是的,正如此测试一样,数据在调试模式下可见,因为它是context / itemsource的一部分。

更新:

我尝试使用相同的结果实现以下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方法时,以下是我的结果:

four columns?

3 个答案:

答案 0 :(得分:12)

您缺少定义绑定的属性:至少,更改Proxy类,如下所示:

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

答案 1 :(得分: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>

在您的情况下,由于集合包含代理,您需要绑定到代理成员。您没有显示代理代码,因此我只能猜出这些成员是什么。 如果您想通过datacontext,那么您需要使用viewmodel。在这种情况下,我建议您首先阅读有关MVVM的内容。

答案 2 :(得分:1)

您应首先在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。

更改您的Model类以实现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;
}