如果我创建了对IsReadOnly
的{{1}}属性的绑定,则它不会实现。如果我通过标记设置它,它的工作原理。
DataGridTextColumn
<DataGridTextColumn IsReadOnly="{Binding IsReferenceInactive}"/> <!-- NOP -->
<DataGridTextColumn IsReadOnly="True"/> <!-- Works as expected, cell is r/o -->
属性是DP并且工作正常(出于测试目的,我将其绑定到一个复选框,这有效)
这是一个已知的限制吗?
更新
除了我写的以外,Uups在输出窗口中有一条消息:IsReferenceInactive
似乎是这个:
答案 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