2011-08-03 28 views
0

我正在使用DataGridAutogenerateColumns設置爲true所有DataGrid標題必須具有唯一的名稱 - 如何解決它

我通過DataContext屬性將它綁定到弱類型DataTable

我遇到的問題是所有標題都必須具有唯一的名稱,因爲myGrid.Columns[x].Header的值直接與底層的DataTable(顯然,不允許有重複的列名稱)的列名相關聯。

是否有任何明智的解決方法?

+0

您能否詳細說明您的問題? Isnt DataTable做你想做的(列名的唯一性)對嗎? –

+0

我想在'DataGrid'中包含非唯一標題 - 顯示名稱;在UI中!不影響'DataTable'中的列名(這會導致拋出異常)。我不希望(可見)標題名稱與(邏輯)列名稱連接;但截至目前,他們是。 –

回答

1

下面的代碼是未經測試...

對於DataGridHeaders改變,你就必須重寫他們的ContentTemplate。

<DataGrid.Resources> 
    <Style TargetType="{x:Type dg:DataGridColumnHeader}"> 
     <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock> 
         <TextBlock.Text> 
          <MultiBinding Converter="{StaticResource DynamicColumnHeaderTextConverter}"> 
           <Binding BindsDirectlyToSource="True"/> 
           <Binding Path="ItemsSource" RelativeSource="{RelativeSource AncestorType={x:Type dg:DataGrid}}" /> 
          </MultiBinding> 
         </TextBlock.Text> 
        </TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </Setter.Value> 
     </Setter> 
    </Style> 
    </DataGrid.Resources> 

在上面的代碼DynamicColumnHeaderTextConverter的轉換()方法將接收2個值

  1. 列標題即數據表列名
  2. 數據表本身。

基於此返回非唯一名稱。

public class DynamicColumnHeaderTextConverter : IMultiValueConverter 
    { 
     public object Convert(object[] values, ...) 
     { 
       var columnName = (string)values[0]; 
       var dataTable = (DataTable)values[1]; //// if you want to decide name based on some value in the DataTable. 
       switch(columnName) 
       { 
        case "MyColumn1" : return "MyColumn"; 
        case "MyColumn2" : return "MyColumn"; 
       } 

       return columnName; 
     } 
    } 

讓我知道這是否有幫助。

+0

謝謝!我明天會試試這個(我今天差不多完成了:))。順便說一句,我已經覆蓋'DataGridColumnHeader'' ContentTemplate',所以我只是將你提出的代碼合併。我會讓你知道 –

+0

我試過了,但不幸的是它不起作用。我得到一個XamlParseException:「'Binding'不能在'Binding'類型的'Path'屬性上設置,'Binding'只能在DependencyObject的DependencyProperty上設置。 –

+0

嗨Vibo,對於代碼錯誤抱歉... 應該是 ...我已經編輯了上面的代碼...對不起再次! –

相關問題