.Net v4 DataGridTextColumn.IsReadOnly似乎有问题

时间:2010-07-11 11:22:52

标签: .net wpf wpfdatagrid

如果我创建了对IsReadOnly的{​​{1}}属性的绑定,则它不会实现。如果我通过标记设置它,它的工作原理。

DataGridTextColumn

<DataGridTextColumn IsReadOnly="{Binding IsReferenceInactive}"/> <!-- NOP --> <DataGridTextColumn IsReadOnly="True"/> <!-- Works as expected, cell is r/o --> 属性是DP并且工作正常(出于测试目的,我将其绑定到一个复选框,这有效)

这是一个已知的限制吗?

更新

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

IsReferenceInactive

似乎是这个:

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

6 个答案:

答案 0 :(得分:30)

与codekaizen相同,但更简单:

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

答案 1 :(得分:15)

DataGridColumn不是可视树的一部分,并且不参与这样的绑定。我解决它的方法是使用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

答案 2 :(得分: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>

现在,您可以通过DataContex的{​​{1}}属性绑定到Data,就像您期望的那样。

BindingProxy

答案 3 :(得分:0)

DataGridTextColumn的绑定仅适用于Text属性,但不适用于DataGridTextColumn的其他属性。

<强>解决方案: DataGridTextColumn告诉DataGrid为每一行和该列创建一个TextBlock。您可以为TextBlock定义样式,并将Style与Style.Key链接到该列的TextBlock(ElementStyle)。

当然,TextBlock现在需要从datalist中找到对象。它可以使用带有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

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

答案 4 :(得分: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>

答案 5 :(得分:0)

我找到了一个很好的解决方案,可以通过使用MarkupExtension将DataGridColumns与绑定一起使用。这样可以使用与转换器的绑定:https://stackoverflow.com/a/27465022/9758687