簡體   English   中英

與實體框架的DataGrid ComboBox綁定

[英]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正常工作,必須使用ElementStyleEditingElementStyle ,如下所示:

<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM