.Net v4 DataGridTextColumn.IsReadOnly似乎有问题

HCL*_*HCL 25 .net wpf datagrid

如果我创建了对该IsReadOnly属性的绑定DataGridTextColumn,则它不会实现.如果我通过标记设置它,它的工作原理.

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

<DataGridTextColumn IsReadOnly="True"/> <!-- Works as expected, cell is r/o -->
Run Code Online (Sandbox Code Playgroud)

IsReferenceInactive属性是一个DP并且工作正常(出于测试目的,我将它绑定到一个复选框,这有效)

这是一个已知的限制吗?

更新

Uups,除了我写的,输出窗口中有一条消息:

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

<DataGridTextColumn IsReadOnly="True"/> <!-- Works as expected, cell is r/o -->
Run Code Online (Sandbox Code Playgroud)

似乎是这个:

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

han*_*aad 30

与codekaizen相同但更简单:

<DataGridTextColumn>
  <DataGridTextColumn.CellStyle>
    <Style>
      <Setter Property="UIElement.IsEnabled" Value="{Binding IsEditable}" />
    </Style>
  </DataGridTextColumn.CellStyle>
</DataGridTextColumn>
Run Code Online (Sandbox Code Playgroud)

  • “UIElement.IsEnabled”还使单元格变得不可选择,这意味着此类列无法在键盘上导航,并且它们的值无法复制到剪贴板。 (2认同)

cod*_*zen 16

DataGridColumns不是可视树的一部分,也不参与这样的绑定.我解决它的方法是使用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>
Run Code Online (Sandbox Code Playgroud)

还有其他的解决方法,我发现它有点过于hackish,但它们确实有效; 这就是:http://blogs.msdn.com/b/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-to-its-columns.aspx


小智 7

我找到了这个解决方案,它允许您在未继承 DataContext 时绑定到数据:http : //www.thomaslevesque.com/2011/03/21/wpf-how-to-bind-to-data-when-the-数据上下文不是继承的/

添加BindingProxyThomas 编写的类并将此资源添加到您的DataGrid

<DataGrid.Resources>
    <local:BindingProxy x:Key="proxy" Data="{Binding}" />
</DataGrid.Resources>
Run Code Online (Sandbox Code Playgroud)

现在您可以按照您的预期绑定到您的DataContexviaData属性BindingProxy

<DataGridTextColumn Header="Price"
                    Binding="{Binding Price}"
                    IsReadOnly="{Binding Data.LockFields, Source={StaticResource proxy}}"/>
Run Code Online (Sandbox Code Playgroud)