2009-05-05 49 views
4

我在理解WPF數據綁定的基礎知識時遇到了問題。我有一個泛型DataGrid(AutoGenerateColumns設置)綁定到一個DataTable列名稱隨每個負載而不同。當dataTable包含布爾類型的列時,我想渲染一個包含表示true和false的自定義圖像的列。WPF通用DataGrid CellTemplate - 綁定到單元格值?

要做到這一點,我有一個靜態資源的celltemplate在頁面上宣佈,我有捕獲該AutoGenerateColumn事件,並使用該模板的C#代碼:

<DataTemplate x:Key="CheckmarkColumnTemplate"> 
    <Image x:Name="CheckmarkImage" Source="..\..\images\check.png" Height="16" Width="16" /> 
    <DataTemplate.Triggers> 
     <DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Value}" Value="False"> 
      <Setter TargetName="CheckmarkImage" Property="Source" Value="..\..\images\nocheck.png" /> 
     </DataTrigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

C#代碼:

private void dgData_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    if (e.PropertyType == typeof(bool)) 
    { 
     DataGridTemplateColumn col = new DataGridTemplateColumn(); 
     Binding binding = new Binding(e.PropertyName); 
     col.CellTemplate = (this.Resources["CheckmarkColumnTemplate"] as DataTemplate); 
     col.Header = e.PropertyName; 
     e.Column = col; 
    } 
} 

這主要是工作,除了我有DataTrigger綁定屬性搞砸了。它從不檢測列的值是否爲「false」,所以它從不顯示nocheck.png圖像。我不知道如何編寫Binding屬性,以便引用列的數據綁定值(請記住,列名每次都不相同,因此我無法在綁定的Path部分中對列名進行硬編碼) 。

任何人都可以告訴我什麼Binding屬性應該看起來像只是抓住列的值?

回答

1

我通過使用不同的方法實現了我之後的結果。如果不使用DataGridTemplateColumn的,我用了一個DataGridCheckBoxColumn並設置自定義ElementStyle基於關閉在WPF工具包的「動手實驗室」中使用的樣本樣式:

<Style x:Key="NoBorderCheckBoxStyle" TargetType="{x:Type CheckBox}"> 
    <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/> 
    <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/> 
    <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/> 
    <Setter Property="BorderThickness" Value="1"/> 
    <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/> 
    <Setter Property="HorizontalAlignment" Value="Center"/> 
    <Setter Property="IsEnabled" Value="false"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type CheckBox}"> 
       <BulletDecorator SnapsToDevicePixels="true" Background="Transparent"> 
        <BulletDecorator.Bullet> 
         <Canvas x:Name="canvas" Width="16" Height="16" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="5"> 
          <Image x:Name="checkImage" Source="..\..\images\check.png" Height="16" Width="16"></Image> 
         </Canvas> 
        </BulletDecorator.Bullet> 
        <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" RecognizesAccessKey="True"/> 
       </BulletDecorator> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasContent" Value="True"> 
         <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}"/> 
         <Setter Property="Padding" Value="4,0,0,0"/> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="False"> 
         <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
        </Trigger> 
        <Trigger Property="IsChecked" Value="False"> 
         <Setter Property="Source" TargetName="checkImage" Value="..\..\images\nocheck.png" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

我有問題,閱讀從了「的IsEnabled」屬性實際的DataGrid列設置(它的屬性是「IsReadOnly」),但是因爲我對DataGrid的使用是隻讀的,所以我在這裏將它設置爲false。

2

我有同樣的問題,仍然在尋找答案。我目前的解決方案是在AutoGeneratingColumn事件處理程序中創建DataTemplate,以便DataTemplate知道屬性名稱。

private void OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
{ 
    e.Column = new DataGridTemplateColumn 
    { 
     Header = e.PropertyName, 
     CellTemplate = CreateSimpleCellTemplate(e.PropertyName) 
    } 
} 

private static DataTemplate CreateSimpleCellTemplate(string propertyName) 
{ 
    DataTemplate template = new DataTemplate(); 
    template.VisualTree = new FrameworkElementFactory(typeof(Label)); 
    template.VisualTree.SetBinding(ContentProperty, new Binding(propertyName)); 
    return template; 
} 
+0

我需要你的幫助。我們可以在[中文聊天室](http://chat.stackexchange.com/rooms/12811/chinese-language)進行對話嗎?請在那裏提及我的名字。謝謝。 (◠‿◠) – 2014-12-12 16:10:33