wpf DataGridTextColumn.IsReadOnly似乎有错误

83qze16e  于 2022-11-18  发布在  其他
关注(0)|答案(7)|浏览(154)

如果我创建一个绑定到DataGridTextColumnIsReadOnly属性,它不会实现。如果我通过标记设置它,它会工作。

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

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

IsReferenceInactive属性是一个DP,工作正常(出于测试目的,我将其绑定到一个复选框,该复选框工作正常)
这是否为已知限制?

更新

Uups,除了我写的,输出窗口中有一条消息:
系统.窗口.数据错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。绑定表达式:路径=IsReferenceInactive;数据项=空;目标元素为“DataGridTextColumn”(哈希代码=23836176);目的属性为'IsReadOnly'(型别为'Boolean')

weylhg0b

weylhg0b1#

与代码改善相同,但更简单:

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

nkkqxpd92#

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

vdgimpew

vdgimpew3#

我发现了这样一个解决方案,它允许您在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}}"/>
zzlelutf

zzlelutf4#

DataGridTextColumn的系结只适用于Text属性,而不适用于DataGridTextColumn的其他属性。

**解决方案:**DataGridTextColumn通知DataGrid为每一行与该列创建一个TextBlock.您可以为TextBlock定义一个样式,并将该样式与该列得TextBlock得Style.Key(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
祝你好运,你需要它:-)

dojqjjoe

dojqjjoe5#

如果您喜欢@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>
9rbhqvlz

9rbhqvlz6#

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

im9ewurl

im9ewurl7#

如果您已使用EditingElementStyle,且需要透过系结变更IsEnabled值:

<DataGridTextColumn
        MinWidth="100"
        MaxWidth="250"
        Binding="{Binding MessageText, UpdateSourceTrigger=PropertyChanged}"
        ElementStyle="{StaticResource TextBlockStyle}"
        Header="Message Text">
        <DataGridTextColumn.EditingElementStyle>
            <Style BasedOn="{StaticResource TextBoxStyle}" TargetType="TextBox">
                <Setter Property="IsEnabled" Value="{Binding IsEnabledMessage}" />
            </Style>
        </DataGridTextColumn.EditingElementStyle>
    </DataGridTextColumn>

相关问题