实际上我读了很多解决方案但是太长了。 没有办法做这样的事情:
DataGrid.Items.Add("element");
答案 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"); } }
}