2013-07-15 49 views
2

使用VS 2010我計劃製作幾個數據網格模板列,但它們都將包含一個文本塊,我希望它們在排序,篩選,編輯等方面的行爲與文本列相同(例如,一列在一個堆棧面板中有一個文本塊和一個圖像,但是在行爲上它應該完全是關於文本的。)如何在WPF中重用自定義datagrid列代碼?

當使用模板列時,我已經瞭解到,與普通文本單元相關的許多功能必須重做。例如,爲了使文本編輯,必須提供像一個單元格編輯模板:

<DataGridTemplateColumn.CellEditingTemplate> 
    <DataTemplate> 
     <TextBox 
     FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}" 
     Text="{Binding Path=SomeProperty, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"> 
      </TextBox> 
    </DataTemplate> 
</DataGridTemplateColumn.CellEditingTemplate> 

你還必須處理網格事件,以確保它的行爲像一個正常的文本框,像自動開始編輯模式,如果用戶按下一個鍵,或標籤到單元格等)

所以我的問題是,什麼是最好的方式(如果有的話),以避免必須明確寫入此代碼(以及用於排序,複製,過濾,等像textcell,對於每個模板列代碼創建這樣?我假設它是不好的做法被複制的代碼的頁面的一半價值爲每列,其中唯一的差異可能綁定的屬性名稱和視覺改變了一把。

我對此感到沮喪,並且對WPF一般。我已經沖刷網頁,我已經試過裝飾器,我已經試過繼承一個DataGrid列,我已經嘗試定義數據模板的用戶控件,並且一切似乎都失敗,一些討厭的「疑難雜症」。這是關於我以不同的細節詢問的第三個問題,只有最少的迴應。應該是這樣很難搞清楚如何實現的東西基本上都是榮耀的文本列,而無需徹底改造整個車輪每一次和在每一個方面。至少在我的愚見中。

+1

你過於複雜這一切太多。你爲什麼不只是設置了'CellStyle'的相關列,並覆蓋了'DataGridCell.Template'呢?您也可以將這些模板定義爲資源並重用它們。這樣,你就可以保留'DataGridTextColumn'而不必自己實現它。 –

+0

聽起來不錯 - 你能給我一些代碼來處理嗎?例如,您是否可以告訴我如何使用單元格樣式來修改現有的'DataGridTextColumn',使其顯示文本以及旁邊的圖像? – Tekito

回答

1

你能告訴我如何使用單元格樣式來修改現有的DataGridTextColumn,使它顯示文字以及旁邊的圖像?

這裏:

<DataGridTextColumn Binding="{Binding LastName}"> 
    <DataGridTextColumn.CellStyle> 
     <Style TargetType="DataGridCell"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="DataGridCell"> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition/> 
           <ColumnDefinition Width="16"/> 
          </Grid.ColumnDefinitions> 

          <ContentPresenter ContentSource="Content"/> 
          <Image Source="/Images/Homer.jpg" Grid.Column="1"/> 
         </Grid> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 

有了一些更多的工作,你可以在你的應用程序中定義這些模板和樣式爲Resources每一次重複使用。

至於圖像源,你可以使用一個Attached PropertyDataGridTextColumn定義它,甚至Tag財產。

編輯:例如具有附加屬性:

<DataGrid ...> 
      <DataGrid.Resources> 
       <ControlTemplate TargetType="DataGridCell" x:Key="TextAndImageDataGridCellTemplate"> 
        <Grid> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition/> 
          <ColumnDefinition Width="16"/> 
         </Grid.ColumnDefinitions> 

         <ContentPresenter ContentSource="Content"/> 
         <Image Source="{Binding Column.(local:GridColumnProperties.ImageSource), RelativeSource={RelativeSource TemplatedParent}}" Grid.Column="1"/> 
        </Grid> 
       </ControlTemplate> 
      </DataGrid.Resources> 
      <DataGrid.Columns> 
       <DataGridTextColumn Binding="{Binding LastName}" 
            local:GridColumnProperties.ImageSource="/Images/Homer.jpg"> 
        <DataGridTextColumn.CellStyle> 
         <Style TargetType="DataGridCell"> 
          <Setter Property="Template" Value="{StaticResource TextAndImageDataGridCellTemplate}"/> 
         </Style> 
        </DataGridTextColumn.CellStyle> 
       </DataGridTextColumn> 
      </DataGrid.Columns> 
    </DataGrid> 

代碼:

public static class GridColumnProperties 
    { 
     public static readonly DependencyProperty ImageSourceProperty = DependencyProperty.RegisterAttached("ImageSource", typeof(ImageSource), typeof(GridColumnProperties), new PropertyMetadata()); 

     public static void SetImageSource(DependencyObject obj, ImageSource value) 
     { 
      obj.SetValue(ImageSourceProperty, value); 
     } 

     public static ImageSource GetImageSource(DependencyObject obj) 
     { 
      return obj.GetValue(ImageSourceProperty) as ImageSource; 
     } 
    } 
+0

爲什麼選擇時單元顯示爲空白?任何方式使它仍然顯示藍色背景的內容? – Tekito

+0

@Tekito由於您已經覆蓋默認的'Template',因此您失去了默認的視覺行爲。查看默認樣式顯示的最後一個XAML [這裏](http://msdn.microsoft.com/en-us/library/cc278066(v = vs.95).aspx)。您可以複製該模板並修改它以包含我的代碼。 –

+0

我會給它一個鏡頭。發佈這個非常誠摯的感謝。試圖弄清楚這一點,我的理智一直沒有變。毫無疑問,WPF是一個強大的工具,但它也是我遇到的最棘手的工具之一,除非您能夠花費大量的時間掌握它。 – Tekito

-2

創建一個庫項目,添加代碼和標記,並從項目中引用這個新的dll。

+1

這對我來說有點模糊。一個包含什麼的庫項目?數據模板?繼承的數據網格模板列?儘管我盡了最大的努力,但我顯然不是WPF的精靈。 – Tekito

+0

嗯,喲有一些閱讀工作: http://msdn.microsoft.com/en-us/library/bb514641(v=vs.90).aspx – Oscar

相關問題