2010-07-11 35 views
18

如果我創建了DataGridTextColumnIsReadOnly屬性的綁定,它不會實現。如果我通過標記來設置它,它會起作用。.Net v4 DataGridTextColumn.IsReadOnly似乎有問題

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

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

IsReferenceInactive屬性是一個DP和工作正常(出於測試目的,我綁定了一個複選框,該工作)

這是一個已知的限制?

更新

UUPS,其他比我寫的,有在輸出窗口消息:

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

似乎是這樣的一個:

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

回答

11

DataGridColumn s不是視覺樹的一部分,也不參與像這樣的綁定。我解決這個問題的方式是使用DataGridTemplateColumn

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

還有其他的解決辦法,我發現有點太過分了,但他們確實有效;即:http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx

+0

好吧,最終我也說過了。在輸出窗口中我看起來不夠好。對不起,我發佈的速度很快。但我不會刪除這個問題,也許它會幫助那些也匆忙的人:) – HCL 2010-07-11 11:27:42

+1

沒問題;它爲Google/Bing提供了更多的飼料,以便在SO上提出問題時找到正確的答案。 – codekaizen 2010-07-11 11:29:51

25

同codekaizen但更簡單:

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

綁定的DataGridTextColumn的僅適用於Text屬性,而不是DataGridTextColumn的其他屬性。

解決方案: DataGridTextColumn通知DataGrid爲每一行和該列創建一個TextBlock。您可以爲TextBlock定義樣式,並將Style和Style.Key鏈接到該列的TextBlock(ElementStyle)。

當然,TextBlock現在需要從數據列表中找到對象。它可以通過使用AncestorType = DataGridRow的RelativeSource綁定來實現。 DataGridRow然後提供對象的訪問。

事情是這樣的:

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

複雜吧?我建議你閱讀我約的DataGrid詳細的文章在格式化: http://www.codeproject.com/Articles/683429/Guide-to-WPF-DataGrid-formatting-using-bindings?msg=5037235#xx5037235xx

祝你好運,你需要它:-)

+0

此解決方案不起作用。 TextBlock沒有IsReadOnly屬性。 TextBox具有該屬性,但只能與EditingElementStyle一起使用,這會產生視覺上不同的結果。 – 2015-10-15 12:51:33

0

如果你喜歡@ codekaizen的解決方案,但將有一個殘疾人TextBox的樣子,那麼這將這樣的伎倆:

<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

我發現這個解決方案,它可以讓你綁定到數據時,在DataContext沒有繼承: http://www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-datacontext-is-not-inherited/

添加ŧ他BindingProxy類托馬斯寫道,這資源添加到您的DataGrid

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

現在你可以通過BindingProxyData屬性綁定到你的DataContex就像你期望的那樣。

<DataGridTextColumn Header="Price" 
        Binding="{Binding Price}" 
        IsReadOnly="{Binding Data.LockFields, Source={StaticResource proxy}}"/> 
相關問題