好的,所以这很难解释。
情景:
我有一个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; 但是,根本没有添加任何行,是的,正如此测试一样,数据在调试模式下可见,因为它是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方法时,以下是我的结果:
答案 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;
}