如何将布尔值绑定到GridViewColumn复选框(有代码但不起作用)?

时间:2011-03-16 20:46:24

标签: c# .net data-binding listview gridviewcolumn

我正在尝试将bool值绑定到GridViewColumn中的复选框,但它不起作用。我甚至试图返回false,但复选框仍然显示为启用。它只适用于在xaml中输入“False”。

绑定属性是:

public bool HasPermissions
{
    get { return this.UserPrivileges == UserPrivileges.FullAccess; }
}

this.UserPrivileges的当前值不是UserPrivileges.FullAccess

Xaml代码:

<Window x:Class="EffectsWindow.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Effects Manager"
        Width="800"
        Height="500"
        DataContext="{Binding RelativeSource={RelativeSource Self}}"
    <DockPanel VerticalAlignment="Stretch">
        <DockPanel.Resources>

        <ListView x:Name="EffectsListView"
                  ItemsSource="{Binding AllEffects}">

            <ListView.View>
                <GridView>

                    <GridViewColumn Width="50" Header="Override">
                        <GridViewColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox Margin="0"
                                          HorizontalAlignment="Center"
                                          IsEnabled="{Binding HasPermission}"/>
                            </DataTemplate>
                        </GridViewColumn.CellTemplate>
                    </GridViewColumn>

                </GridView>
            </ListView.View>
        </ListView>

    </DockPanel>
</Window>

编辑:当前属性代码:

public bool HasPermissions
{
    get { return this.UserPermissions == UserPermissions.FullAccess; }
    set { this.RaisePropertyChanged ( "HasPermissions" ); }
}

1 个答案:

答案 0 :(得分:1)

考虑更新后的属性中的问题:该属性没有后备字段,其getter返回将不同属性与UserPermissions.FullAccess进行比较的结果。因此,它永远不会 设置。

需要关注的是,什么时候需要通知UI HasPermissions返回的值已经改变?那么,当可以那个值改变了吗?当this.UserPermissions的值发生变化时,对吧?

假设this.UserPermissions本身是一个带有setter的属性,其setter 就是调用RaisePropertyChanged("HasPermissions")的地方。这将告诉UI,即使它没有直接绑定到UserPermissions,它 绑定到的属性也必须重新评估。

更新关于您的评论,IsChecked确实是您应该绑定HasPermissions的CheckBox属性,如果您希望框的已选中状态指示用户有权限。

更新第二个:听起来您想要从可视子项(ListBox)访问Window的DataContext的属性。你可以使用RelativeSource绑定来实现它,如下所示:

<CheckBox Margin="0"
          HorizontalAlignment="Center"
          IsEnabled="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.HasPermission}"/>

这种有点笨重的符号将在可视树中找到最接近CheckBox的父元素,它是Window类型,并绑定到其DataContext属性以查找HasPermission。