How to bind boolean to GridViewColumn checkboxes (have code but doesn't work)?

无人久伴 提交于 2019-12-22 01:21:27

问题


I am trying to bind a bool value to checkboxes in a GridViewColumn, but it doesn't work. I even tried just returning false, but the checkboxes still look enabled. It only works if I type "False" into the xaml.

The binded property is:

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

Current value of this.UserPrivileges is not UserPrivileges.FullAccess.

Xaml code:

<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>

EDIT: Current property code:

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

回答1:


Think about the problem in your updated property: that property has no backing field, its getter returns the result of comparing a different property with UserPermissions.FullAccess. Therefore it can never be set.

The thing to focus on is, when does the UI need to be notified that the value returned by HasPermissions has changed? Well, when can that value change? When the value of this.UserPermissions changes, right?

Assuming this.UserPermissions is itself a property with a setter, its setter is the place to call RaisePropertyChanged("HasPermissions"). That will tell the UI that, even if it doesn't bind to UserPermissions directly, the property it does bind to must be re-evaluated.

Update: Regarding your comment, IsChecked is indeed the CheckBox property you should bind HasPermissions to if you want the box's checked state to indicate that the user has permission.

Update the 2nd: It sounds like you want to access a property of the Window's DataContext from a visual child (the ListBox). You can use a RelativeSource binding to achieve that, like so:

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

That somewhat clunky notation will find the nearest parent element to the CheckBox in the visual tree that is of type Window, and bind to its DataContext property to find HasPermission.



来源:https://stackoverflow.com/questions/5331520/how-to-bind-boolean-to-gridviewcolumn-checkboxes-have-code-but-doesnt-work

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!