2013-03-24 53 views
0

經過1.5天的頭疼,喝咖啡的努力,我最終放棄並呼籲您提出明智的建議:)。DataGridTemplateColumn中的ComboBox.SelectedItem不綁定到它自己的DataGridRow

我在DataGrid TemplateColumn裏發現了不少關於ComboBox DataBinding的帖子,但是他們沒有一個似乎幫助我。

這是我的問題:

我有一個包含有關Excel列信息對象ViewSource: 列名,列索引與數據庫列的信息的對象。

我的第二個ViewSource是具有數據庫列信息的那些對象的列表。

我的目標是加載WPF DataGrid中的所有Excel列,並在列出所有數據庫列的每行中都有一個ComboBox

這個工作正常,當我使用DataGridComboBoxColumn,但我不喜歡用戶不得不點擊3次打開組合框。無論如何,你需要點擊它,這在視覺上並不明顯。 (好吧,我可以設計它)。

所以我把一個正常的WPF ComboBox放在DataGridTemplateColumn中,但是所有組合框都將SelectedItem綁定到了DataGrid.SelectedItem,而不是它們所屬的實際行。無論我嘗試什麼,我都無法理解它的行爲! :)

<DataGrid x:Name="ColumnMappings" DataContext="{StaticResource ColumnMappingsViewSource}" ItemsSource="{Binding}" Margin="10,146,10,40" Background="{DynamicResource ControlContainerBackgroundBrush}" BorderBrush="{DynamicResource ControlContainerBorderBrush}" AlternationCount="2" HeadersVisibility="Column" GridLinesVisibility="Horizontal" AutoGenerateColumns="False" SelectionMode="Single" RowBackground="{DynamicResource RowBackGroundBrush}" AlternatingRowBackground="{DynamicResource RowAlternatingBackGroundBrush}" CanUserDeleteRows="False" CanUserAddRows="False"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding ColumnName}" ClipboardContentBinding="{x:Null}" Header="Excel Kolom" Width="5*"/> 
      <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource EntityPropertiesViewSource}}" SelectedItemBinding="{Binding EntityProperty}" DisplayMemberPath="DisplayName" Header="Database Kolom" Width="5*"/> 
      <DataGridTemplateColumn Header="Database Kolom" Width="5*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext}" 
            ItemsSource="{Binding Source={StaticResource EntityPropertiesViewSource}}" 
            DisplayMemberPath="DisplayName" 
            SelectedItem="{Binding EntityProperty}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
+0

刪除組合框上的'DataContext'。 'EntityProperty'駐留在當前行的DataContext中,而不是DataGrid的DataContex中。不是嗎? – 2013-03-24 08:18:23

+0

這是我第一次嘗試(它確實與複選框一起工作)。但是,當我在這裏刪除DataContext時,所有框仍然獲得相同的值,當我改變其中一個,現在實際行甚至沒有更新(dataGridcomboboxcolumn不會更改)。 :( – ivanv 2013-03-24 13:09:31

+0

在其他帖子中,我讀過ComboBox ItemSource「覆蓋」DataContext。我最好的猜測是我需要指定正確的DataContext(行中的一個),但我不知道該在哪裏指出它...'AncestorType = {x:Type DataGridRow}'不起作用... – ivanv 2013-03-24 13:15:25

回答

0

我想我現在就開始工作。訣竅是避免使用一個單獨的DataContext爲的ItemSource ...

 <DataGrid x:Name="ColumnMappings" DataContext="{StaticResource ColumnMappingsViewSource}" ItemsSource="{Binding}" Margin="10,146,10,40" Background="{DynamicResource ControlContainerBackgroundBrush}" BorderBrush="{DynamicResource ControlContainerBorderBrush}" AlternationCount="2" HeadersVisibility="Column" GridLinesVisibility="Horizontal" AutoGenerateColumns="False" SelectionMode="Single" RowBackground="{DynamicResource RowBackGroundBrush}" AlternatingRowBackground="{DynamicResource RowAlternatingBackGroundBrush}" CanUserDeleteRows="False" CanUserAddRows="False" IsReadOnly="True"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding ColumnName}" ClipboardContentBinding="{x:Null}" Header="Excel Kolom" Width="5*"/> 
      <DataGridComboBoxColumn ItemsSource="{Binding Source={StaticResource EntityPropertiesViewSource}}" SelectedItemBinding="{Binding EntityProperty}" DisplayMemberPath="DisplayName" Header="Database Kolom" Width="5*"/> 
      <DataGridTemplateColumn Header="Database Kolom" Width="5*"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox ItemsSource="{Binding EntityProperties}" 
            DisplayMemberPath="DisplayName" 
            SelectedItem="{Binding EntityProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

唯一的缺點是,我的每一個ColumMapping對象需要有EntityProperties的完整列表的副本:

public class ColumnMapping 
{ 
    public ColumnMapping(string columnName, int columnIndex, EntityProperty entityProperty, List<EntityProperty> entityProperties) 
    { 
     ColumnName = columnName; 
     ColumnIndex = columnIndex; 
     EntityProperty = entityProperty; 
     EntityProperties = entityProperties; 
    } 

    public string ColumnName { get; private set; } 
    public int ColumnIndex { get; private set; } 
    public EntityProperty EntityProperty { get; set; } 
    public List<EntityProperty> EntityProperties { get; private set; } 
} 

public class EntityProperty 
{ 
    public EntityProperty(string displayName, string name) 
    { 
     DisplayName = displayName; 
     Name = name; 
    } 

    public string DisplayName { get; private set; } 
    public string Name { get; private set; } 
} 

如果有人可能知道更好的(更清潔)解決方案,請告訴我:)

相關問題