WPF绑定实现隐藏DataGridColumn

3

由于某些原因,我无法隐藏WPF Toolkit的DataGridColumn。我正在尝试执行以下操作:

<dg:DataGridTemplateColumn Header="Item Description" Visibility="{Binding IsReadOnly}">
<dg:DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBox Text="{Binding Path=ItemDescription}" />
    </DataTemplate>
</dg:DataGridTemplateColumn.CellTemplate>

这样不起作用,因为它在ItemSource上查找IsReadOnly属性(而非当前类的属性)。 如果将其添加为实现INoifyPropertyChanged的ItemSource类的属性,它仍然无法隐藏列。有没有绕过此限制的方法?我想要在按钮单击更改IsReadOnly属性时隐藏该列。

假设IsReadOnly返回Visibility值并且是依赖属性

我完全陷入了困境,非常感谢您的帮助!非常感谢!

3个回答

6

这篇问题中提到:

WPF DataGrid:将DataGridColumn的可见性绑定到ContextMenu MenuItems IsChecked(MVVM)

Fubzot正在使用类似以下的绑定代码:

Visibility='{Binding (FrameworkElement.DataContext).IsReadOnly,
RelativeSource={x:Static RelativeSource.Self}}'

您可能还想查看这个链接:将DataGrid的DataContext转发到其列中..,该链接也在上述问题中提到。
只是为了我的信息:您是否在使用当前代码时在输出窗口中看到任何绑定错误?

非常感谢,这与下面的答案非常相似。我确实看到了绑定错误,所以我知道我有问题 :( - Greg R

5

如果您想绑定到DataGridColumnIsReadOnly属性,只需在绑定中添加RelativeSource(和一个转换器):

<BooleanToVisibilityConverter x:Key="boolToVis" />

...

<dg:DataGridTemplateColumn Header="Item Description" Visibility="{Binding IsReadOnly, RelativeSource={RelativeSource Self}, Converter={StaticResource boolToVis}}">

此外,看起来像是这个StackOverflow问题可能与您的问题有关。

-1

你需要使用一个转换器

 Public Class BooleanToVisibilityConverter
        Implements IValueConverter
        Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.Convert
            If targetType Is GetType(Visibility) Then
                If CBool(value) = True Then
                    Return Visibility.Hidden
                Else
                    Return Visibility.Visible
                End If
            Else
                Return Nothing
            End If
        End Function

        Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack
            Return Nothing
        End Function
    End Class

然后您可以在XAML中使用转换器。 示例


假设IsReadOnly已经返回了一个可见性值,那不是我的问题,我的问题在于数据网格不想尊重它。 - Greg R
好的,这个问题有点傻。在你的VM属性IsReadOnly中,你的setter里面有OnPropertyChanged("IsReadOnly")吗?我知道有时候我会忘记加上它,没有它UI就不会有反应。 - ecathell
2
BooleanToVisibilityConverter类已经存在于System.Windows.Controls中,无需重新创建它 ;) - Thomas Levesque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接