[英]DataGrid ComboBox binding with Entity Framework
我目前有一個C#
WPF
.NET 4.5
應用程序。 我正在使用DataGrid
來顯示項目數據庫中的項目。 我能來填充一切DataGrid
除了DataGridComboBoxColumn
。 首先,我只想讓它顯示數據。 將來,我希望組合框在第一行顯示數據庫中的當前值,但是讓ComboBox包含設置值,以限制用戶可以輸入的內容。 因此,這就像列表item1 =當前值,列表item2 =磅,列表item3 =盎司,等等。該表有3列我正在使用的列,即InventoryName,Qty和Type。 類型應為ComboBox
這是我的代碼
private AuroraDataEntities auroraDataEntities;
public ViewCup()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
LoadData();
}
private void LoadData()
{
auroraDataEntities = new AuroraDataEntities();
dgInv.DataContext = auroraDataEntities.Inventories;
}
void EditComplete(object sender, SelectedCellsChangedEventArgs e)
{
auroraDataEntities.SaveChanges();
}
private void Window_Unloaded(object sender, RoutedEventArgs e)
{
auroraDataEntities.SaveChanges();
}
}
這是我的XAML
<DataGrid x:Name="dgInv" HorizontalAlignment="Center" Height="134" Margin="-10,96,10,0" VerticalAlignment="Top" Width="Auto"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding}"
AutoGenerateColumns="False"
GridLinesVisibility="None"
SelectedCellsChanged="EditComplete">
<DataGrid.Columns>
<DataGridTextColumn Width="200" Header="InventoryName" Binding="{Binding InventoryName}" />
<DataGridTextColumn Width="50" Header="Qty" Binding="{Binding Qty}" />
<DataGridComboBoxColumn x:Name="cbType"
Width="50"
Header="Type"
ItemsSource="{Binding Path=Type, Mode=TwoWay}"
DisplayMemberPath="Type"
SelectedValueBinding="{Binding Type}" >
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
為了使DataGridComboBoxColumn
正常工作,必須使用ElementStyle
和EditingElementStyle
,如下所示:
<DataGridComboBoxColumn x:Name="cbType" Width="50" Header="Type"
DisplayMemberPath="Type" SelectedValueBinding="{Binding Type}" >
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Type}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Type}"/>
</Style>
</DataGridComboBoxColumn.ElemEditingElementStyleentStyle>
</DataGridComboBoxColumn>
這將使用ItemsSource
填充網格列中的ComboBox
。 根據您在網格中使用ComboBox
的方式,可能不需要設置ElementStyle
。 有關為什么需要這樣做的一些信息,請參見此答案 。
您的DataContext應該具有ViewModel,該ViewModel應該公開兩個單獨的屬性,即Inventories和TypeCollection(包含盎司,磅等的數組或列表),並且應將DataGridComboBoxColumn的ItemsSource綁定到TypeCollection,並將SelectedValueBinding綁定到Type。
public class ViewModel{
// implement INotifyPropertyChanged for following
public IEnumerable TypeCollection{ get; private set;}
public IEnumerable Inventories {get; private set;}
}
//設置DataContext,如下所示
this.DataContext = new ViewModel(.....);
//設置綁定,如下所示
<DataGrid x:Name="dgInv" HorizontalAlignment="Center" Height="134" Margin="-10,96,10,0" VerticalAlignment="Top" Width="Auto"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Inventories}"
AutoGenerateColumns="False"
GridLinesVisibility="None"
SelectedCellsChanged="EditComplete">
<DataGrid.Columns>
<DataGridTextColumn Width="200" Header="InventoryName" Binding="{Binding InventoryName}" />
<DataGridTextColumn Width="50" Header="Qty" Binding="{Binding Qty}" />
<DataGridComboBoxColumn x:Name="cbType"
Width="50"
Header="Type"
ItemsSource="{Binding Path=DataContext.TypeCollection,
RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}}"
DisplayMemberPath="Type"
SelectedValueBinding="{Binding Path=Type, Mode=TwoWay}" >
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
請注意,您必須使用RelativeSource查找父DataGrid的DataContext。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.