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;}
}
好吧,这很难解释。
场景:
我有一个 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;}
}