我开始使用WPF的数据网格并面对这个问题。 我有这样的清单
private List<ChainCode> _chainCode = new List<ChainCode>();
其中ChainCode是:
public class ChainCode
{
private uint _number;
private byte _code;
public uint Number { get { return _number; } set { _number = value; } }
public byte Code { get { return _code; } set { _number = value; } }
}
所以,我想将id绑定到这样的DataGrid:
<DataGrid x:Name="dataGridChainCode" ItemsSource="{Binding _chainCode}" CanUserAddRows="True" IsEnabled="False" AutoGenerateColumns="False" Margin="10,35,18,0" VerticalAlignment="Top">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Number}" IsReadOnly="True" Header="#" Width="60"/>
<DataGridTextColumn Binding="{Binding Code}" Header="code" Width="60"/>
</DataGrid.Columns>
</DataGrid>
但是当我启动程序时,我无法向datagrid添加任何行,因为没有行,只有标题。我只是不知道如何解决它。
更新: 我做了这样的改变:
private ObservableCollection<ChainCode> _chainCode = new ObservableCollection<ChainCode>();
public ObservableCollection<ChainCode> OCChainCode { get { return _chainCode; } set { _chainCode = value; } }
xpl中的和下一个:
ItemsSource="{Binding OCChainCode}"
但没有回应。我做错了什么?
我理解的一件事是我使用WPF还为时过早。所以,我稍后会尝试修复它
答案 0 :(得分:1)
您无法绑定到非公开成员。 创建属性
public List<ChainCode> ChainCodeList
{
get { return _chainCode;}
set { _chainCode = value;}
}
并绑定到它。
如果您的列表在应用有效期内发生变化,则可以改为使用ObservableCollection<T>。
答案 1 :(得分:1)
如果您希望在更改Number或Code的值时更新列表,请使用ObservableCollection而不是List并实现INotifyPropertyChanged。
并将您的列表属性设为公开或受保护。
答案 2 :(得分:0)
要使用数据绑定,您需要设置要使用绑定的部件的DataContext。设置DataContext有几种不同的方法,一种简单的方法是在UserControl类的构造函数中。通常,DataContext设置为ViewModel(使用Model-View-ViewModel-pattern),但它可以是任何类。
public class ViewModel {
private ObservableCollection<ChainCode> _chainCode = new ObservableCollection<ChainCode>();
public ObservableCollection<ChainCode> OCChainCode
{
// No need for a public setter
get { return _chainCode; }
}
}
UserControl-class([name] .xaml.cs文件中的类):
public class MyUserControl : UserControl
{
public MyUserControl()
{
DataContext = new ViewModel();
}
}
您现在可以在问题中使用xaml。
<DataGrid x:Name="dataGridChainCode" ItemsSource="{Binding _chainCode}" CanUserAddRows="True" IsEnabled="False" AutoGenerateColumns="False" Margin="10,35,18,0" VerticalAlignment="Top">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Number}" IsReadOnly="True" Header="#" Width="60"/>
<DataGridTextColumn Binding="{Binding Code}" Header="code" Width="60"/>
</DataGrid.Columns>
</DataGrid>
需要注意的是,在DataGrid中没有自动添加新行的功能,您必须自己编写此代码。我建议一个按钮创建一个新的ChainCode对象并将其添加到Observable集合,然后它将显示在UI中。