2009-05-05 17 views
4

Ich habe ein Problem, die Grundlagen der Datenbindung in WPF zu verstehen. Ich habe ein generisches DataGrid (mit AutoGenerateColumns-Set), das an eine DataTable mit Spaltennamen gebunden ist, die bei jeder Auslastung variieren. Wenn die dataTable Spalten vom Typ boolean enthält, möchte ich eine Spalte rendern, die benutzerdefinierte Bilder enthält, die wahr und falsch darstellen.WPF generisches DataGrid CellTemplate - an Zellwert binden?

Um dies zu erreichen, habe ich ein Static für die Celltemplate auf der Seite erklärt, und ich habe C# Code, der die AutoGenerateColumn Ereignis einfängt und verwendet diese Vorlage:

<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# -Code:

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; 
    } 
} 

Das funktioniert meistens, außer dass ich die DataTrigger Binding-Eigenschaft vermasselt habe. Es erkennt nie, wenn der Wert der Spalte "false" ist, also zeigt es nieocheck.png Bild. Ich weiß nicht, wie man die Binding-Eigenschaft schreibt, so dass sie auf den datengebundenen Wert der Spalte verweist (bedenke, der Spaltenname ist jedes Mal anders, daher kann ich keinen Spaltennamen im Pfad-Teil der Bindung fest codieren) .

Kann mir jemand sagen, wie die Binding-Eigenschaft aussehen sollte, so dass es nur den Wert der Spalte ergreift?

Antwort

1

Ich erreichte das Ergebnis, das ich suchte, indem ich eine andere Methode benutzte. Anstatt eine Datagridtemplatecolumn zu verwenden, habe ich eine DataGridCheckBoxColumn und eine benutzerdefinierte ElementStyle stellen Sie die Probe Stil verwendet in der WPF-Toolkit „Hands-On Lab“ beruhte:

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

ich Probleme hatte das „IsEnabled“ Eigenschaft aus der Lektüre tatsächlichen DataGrid-Spalteneinstellungen (seine Eigenschaft ist "IsReadOnly"), aber da meine Verwendung des DataGrid schreibgeschützt ist, setze ich es hier einfach auf "false".

2

Ich habe das gleiche Problem und immer noch auf der Suche nach einer Antwort. Meine aktuelle Lösung ist die DataTemplate in AutoGeneratingColumn Event-Handler, so dass die DataTemplate den Namen der Eigenschaft kennt.

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

Ich brauche deine Hilfe. Können wir uns im [Chatroom für chinesische Sprache] unterhalten (http://chat.stackexchange.com/rooms/12811/chineses-language)? Bitte erwähne einfach meinen Namen dort. Vielen Dank. (◠‿◠) –

Verwandte Themen