c#list绑定到wpf datagrid

时间:2014-11-19 21:02:25

标签: c# wpf xaml datagrid data-binding

我开始使用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还为时过早。所以,我稍后会尝试修复它

3 个答案:

答案 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中。