首先我认为如果你定义一个模型类并基于它工作会更优雅,比如说一个类Item:
public class Item
{
public String DepartmentName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String RoleName { get; set; }
public String Contactby { get; set; }
public String ContactType { get; set; }
}
其次将DataGridDataSource绑定到ObservableCollection并实现INotifyChangedInterface,这样你就不必担心每次更新DataGrid在集合或其自身已更改的集合上,因此在您的代码后面(或 ViewModel)中:
private ObservableCollection<Item> _listDg = new ObservableCollection<Item>();
public ObservableCollection<Item> ListDg
{
get
{
return _listDg;
}
set
{
if (_listDg == value)
{
return;
}
_listDg = value;
OnPropertyChanged();
}
}
现在关于DataGrid 中的ComboBoxField,最好的处理方法是:
1. 创建另一个包含 ComboBoxField 项目的集合,您可以将该集合绑定到另一个 listView 以便每次将项目添加到列表中时ComboBoxField 也会更新,
private ObservableCollection<String> _contactByCollection = new ObservableCollection<string>()
{
"One","Two","Three" // you can Bind that collection to a list or add their items programaticlly
};
public ObservableCollection<String> ContactByCollection
{
get
{
return _contactByCollection;
}
set
{
if (_contactByCollection == value)
{
return;
}
_contactByCollection = value;
OnPropertyChanged();
}
}
2.将该集合绑定到CollectionViewSource,并使用它来设置comboBox ItemSource:
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
最后,设置DataGridDataSource和你的页面DataContext
<Window
...
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
<Grid>
<igDP:XamDataGrid DataSource="{Binding ListDg}" x:Name="xamContact" BindToSampleData="True" IsSynchronizedWithCurrentItem="False" IsNestedDataDisplayEnabled="True" >
<igDP:XamDataGrid.ViewSettings>
<igDP:GridViewSettings/>
</igDP:XamDataGrid.ViewSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" ItemsSource="{Binding Source={StaticResource list}}" Visibility="Visible" Label="Contact by">
</igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
</Grid>
这里有一个更详细的示例,ContactBy 项目位于 ListView 中
Title="MainWindow" Height="350" Width="525" DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Window.Resources>
<CollectionViewSource x:Key="list" Source="{Binding ContactByCollection}"/>
</Window.Resources>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<StackPanel Grid.Column="0">
<Button Click="ButtonBase_OnClick" Content="Add new ContactBy Item"/>
<ListView ItemsSource="{Binding ContactByCollection}" Margin="3">
</ListView>
</StackPanel>
<StackPanel Grid.Column="1">
<igDP:XamDataGrid DataSource="{Binding ListDg}" x:Name="xamContact" BindToSampleData="True" IsSynchronizedWithCurrentItem="False" IsNestedDataDisplayEnabled="True" >
<igDP:XamDataGrid.ViewSettings>
<igDP:GridViewSettings/>
</igDP:XamDataGrid.ViewSettings>
<igDP:XamDataGrid.FieldLayouts>
<igDP:FieldLayout>
<igDP:Field Name="DepartmentName" Label="Department Name" />
<igDP:Field Name="FirstName" Width="100" Label="First Name" />
<igDP:Field Name="LastName" Label="Last Name" />
<igDP:Field Name="RoleName" Label="Role Name" />
<igDP:ComboBoxField Name="Contactby" ItemsSource="{Binding Source={StaticResource list}}" Visibility="Visible" Label="Contact by">
</igDP:ComboBoxField>
<igDP:Field Name="ContactType" Label="ContactType" Visibility="Collapsed" />
</igDP:FieldLayout>
</igDP:XamDataGrid.FieldLayouts>
</igDP:XamDataGrid>
<Button Content="Add an Item To the Grid" Click="AddToGrid_Click"></Button>
</StackPanel>
</Grid>
和代码隐藏
public class Item
{
public String DepartmentName { get; set; }
public String FirstName { get; set; }
public String LastName { get; set; }
public String RoleName { get; set; }
public String Contactby { get; set; }
public String ContactType { get; set; }
}
public partial class MainWindow : Window, INotifyPropertyChanged
{
private ObservableCollection<String> _contactByCollection = new ObservableCollection<string>()
{
"One","Two","Three" // you can Bind that collection to a list or add their items programaticlly
};
public ObservableCollection<String> ContactByCollection
{
get
{
return _contactByCollection;
}
set
{
if (_contactByCollection == value)
{
return;
}
_contactByCollection = value;
OnPropertyChanged();
}
}
private ObservableCollection<Item> _listDg = new ObservableCollection<Item>();
public ObservableCollection<Item> ListDg
{
get
{
return _listDg;
}
set
{
if (_listDg == value)
{
return;
}
_listDg = value;
OnPropertyChanged();
}
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
ContactByCollection.Add("NewContactByItem");
}
private void AddToGrid_Click(object sender, RoutedEventArgs e)
{
ListDg.Add(new Item()
{
FirstName = "FirstName" //Other properties
,Contactby = "Three" //..
});
}
}