2010-07-11 23 views
18

Wenn ich eine Bindung an die IsReadOnly Eigenschaft der DataGridTextColumn erstellen, wird es nicht aktualisiert. Wenn ich es markiere, funktioniert es..Net v4 DataGridTextColumn.IsReadOnly scheint fehlerhaft zu sein

<DataGridTextColumn IsReadOnly="{Binding IsReferenceInactive}"/> <!-- NOP --> 

<DataGridTextColumn IsReadOnly="True"/> <!-- Works as expected, cell is r/o --> 

Die IsReferenceInactive Eigenschaft ist ein DP und funktioniert gut (für Prüfzwecke ich es eine Checkbox gebunden haben, die funktioniert)

Ist das eine bekannte Einschränkung?

aktualisieren

Uups, anders als ich schrieb, gibt es eine Meldung im Ausgabefenster:

System.Windows.Data Error: 2 : Cannot find governing FrameworkElement or FrameworkContentElement for target element. BindingExpression:Path=IsReferenceInactive; DataItem=null; target element is 'DataGridTextColumn' (HashCode=23836176); target property is 'IsReadOnly' (type 'Boolean') 

scheint dies zu sein:

http://connect.microsoft.com/VisualStudio/feedback/details/530280/wpf-4-vs2010-datagrid-isreadonly-does-not-work-with-binding-to-boolean-property

Antwort

11

DataGridColumn Sie sind nicht Teil des visuellen Baums und nehmen nicht an der Bindung teil . Die Art, wie ich es umgehen kann, ist DataGridTemplateColumn zu verwenden.

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBlock Text="{Binding Path=myProperty}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox IsEnabled="{Binding Path=myBool}" Text="{Binding Path=myProperty Mode=TwoWay}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 

Es gibt andere Abhilfen, die ich ein bisschen zu hackish gefunden haben, aber sie funktionieren; nämlich: http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

+0

Ok, irgendwann habe ich es auch bemerkt. Ich habe im Ausgabefenster nicht gut genug ausgesehen. Entschuldigung, ich habe zu schnell gepostet. Aber ich werde die Frage nicht löschen, vielleicht wird es jemand helfen, der auch in Eile war :) – HCL

+1

Kein Problem; Es gibt mehr Futter für Google/Bing, um die richtige Antwort zu finden, wenn Fragen zu SO gestellt werden. – codekaizen

25

Gleiche wie codekaizen aber einfacher:

<DataGridTextColumn> 
    <DataGridTextColumn.CellStyle> 
    <Style> 
     <Setter Property="UIElement.IsEnabled" Value="{Binding IsEditable}" /> 
    </Style> 
    </DataGridTextColumn.CellStyle> 
</DataGridTextColumn> 
0

Die Bindung des Datagridtextcolumn funktioniert nur für die Text-Eigenschaft, aber nicht für die anderen Eigenschaften von Datagridtextcolumn.

Lösung: Datagridtextcolumn das Datagrid erzählt eine Textblock für jede Zeile und dieser Spalte zu erstellen. Sie können einen Stil für TextBlock definieren und den Stil mit dem Style.Key mit dem TextBlock dieser Spalte (ElementStyle) verknüpfen.

Natürlich muss der TextBlock jetzt das Objekt aus dem Datenlisten finden. Dies kann mit einer RelativeSource-Bindung mit AncestorType = DataGridRow geschehen. Das DataGridRow stellt dann Zugriff auf das Objekt bereit.

Etwas wie folgt aus:

<Window.Resources> 
    <Style x:Key="IsReadOnlyStyle" TargetType="TextBlock"> 
    <Setter Property="IsReadOnly" 
     Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, 
     Path =Item.NoOutput/> 
    </Style> 
</Window.Resources> 

<DataGrid> 
    <DataGrid.Columns> 
    <DataGridTextColumn Header="Value" Width="*" Binding="{Binding Value}" ElementStyle="{StaticResource IsReadOnlyStyle}"/> 
</DataGrid.Columns> 

Komplizierte richtig?Ich empfehle Ihnen meine ausführlichen Artikel über Datenraster zu lesen bei der Formatierung: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

Viel Glück, Sie brauchen es :-)

+0

Diese Lösung funktioniert nicht. TextBlock hat keine IsReadOnly-Eigenschaft. TextBox besitzt diese Eigenschaft, sie kann jedoch nur mit EditingElementStyle verwendet werden, was zu visuell unterschiedlichen Ergebnissen führt. –

0

Wenn Sie @ codekaizen Lösung aber wird das Aussehen eines behinderten TextBox haben, dann ist dieses den Trick:

<DataGridTemplateColumn> 
    <DataGridTemplateColumn.CellTemplate> 
     <DataTemplate> 
      <TextBox IsEnabled="{Binding Path=myBool}" Text="{Binding Path=myProperty}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellTemplate> 
    <DataGridTemplateColumn.CellEditingTemplate> 
     <DataTemplate> 
      <TextBox IsEnabled="{Binding Path=myBool}" Text="{Binding Path=myProperty, Mode=TwoWay}" /> 
     </DataTemplate> 
    </DataGridTemplateColumn.CellEditingTemplate> 
</DataGridTemplateColumn> 
3

ich diese Lösung gefunden, die Sie Daten zu binden, erlaubt es, wenn die Datacontext nicht vererbt wird: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

hinzufügen t er BindingProxy Klasse Thomas schrieb und diese Ressource hinzufügen, um Ihre DataGrid:

<DataGrid.Resources> 
    <local:BindingProxy x:Key="proxy" Data="{Binding}" /> 
</DataGrid.Resources> 

Jetzt Sie Ihre DataContex über die Data Eigenschaft des BindingProxy nur binden können, wie man es erwarten würde.

<DataGridTextColumn Header="Price" 
        Binding="{Binding Price}" 
        IsReadOnly="{Binding Data.LockFields, Source={StaticResource proxy}}"/> 
Verwandte Themen