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

WPF DataGrid adds rows but not the data (blank rows)

好吧,这很难解释。

场景:

我有一个 DataGrid 定义如下:

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

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

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

问题:

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

疑难解答:

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

相关代码:

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

注意: 我添加了 .ItemSource = null;然后将其设置为等于 collection,因为这样可以显示行。我试过使用建议的: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>

代理 Class:

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

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

您应该首先在 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 和端口属性。

更改您的模型 class 以实施 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;
}

您的列没有绑定。这是有关如何操作的示例:

<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 的内容。

您没有为绑定定义属性:至少,像这样更改代理 class:

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