如何在DataGrid中添加项目(智能方式)

时间:2015-06-19 15:56:21

标签: c# wpf

实际上我读了很多解决方案但是太长了。 没有办法做这样的事情:

DataGrid.Items.Add("element");

2 个答案:

答案 0 :(得分:1)

您应该尝试使用MVVM原则来解决这个问题。换句话说,将datagrid数据绑定到viewmodel中的集合,并将您的项目添加到集合

答案 1 :(得分:1)

由于您使用的是WPF,因此您需要创建一个List,然后使用dataGrid.ItemsSource = yourClassToShowList;。这将自动为您填充列和行项目。在事件SelectedItemChanged之后,您可以获取单个(或多个)所选YouClassToShow个。 WPF使得将数据绑定到UI控件非常简单。

以下是一些例子:

XAML

<DataGrid x:Name="dg" Margin="10,32,10,111" AlternatingRowBackground="White" SelectionChanged="dgDailyMediaReport_SelectionChanged" IsReadOnly="True" AutoGenerateColumns="False" SelectionMode="Single" >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="{Binding Status}" Width="75">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <Grid>
                        <ProgressBar  Height="20"  Grid.Row="0" Grid.Column="0" Minimum="0" Maximum="500" Value="{Binding TotalProgress, Mode=OneWay}"></ProgressBar>
                        <Label HorizontalAlignment="Center" Content="{Binding TotalPercent,Mode=OneWay}"></Label>
                    </Grid>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
        <DataGridTextColumn Header="NAME" Binding="{Binding Name}" Foreground="DarkRed" />
        <DataGridTextColumn Header="AGE" Binding="{Binding Age}" />

    </DataGrid.Columns>

    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem x:Name="menuShowInFolder" Header="Show In Folder" Click="menuShowInFolder_Click"/>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>

C#

Window_Loaded事件:

List<YourClass> yourClassList = yourClassListRepo.GetYourClasses();
dg.ItemsSource = yourClassList;

dg_SelectionChanged事件:

if(dg.SelectedItems.Count > 0){
    foreach(YourClass yourClass in (List<YourClass> dg.SelectedItems)){
        MessageBox.Show(yourClass.Name);
    }
}

Binding="{Binding Name}"此上下文中的“名称”是您的对象公共属性。

因此,您需要一种公共访问方法,例如public String Name {get;set}

旁注:要更改对象的属性值并让其自动显示,您需要在对象本身上INotifyPropertyChanged

人员类:

public class Person: INotifyPropertyChanged
{
    #region PROPERTY_CHANGED_EVENTS
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
    protected bool SetField<T>(ref T field, T value, string propertyName)
    {
        if (EqualityComparer<T>.Default.Equals(field, value)) return false;
        field = value;
        OnPropertyChanged(propertyName);
        return true;
    }
    #endregion

    private String _name;
    public String Name { get { return _name; } set { SetField(ref _name, value, "Name"); } }
}