Skip to content

BoolToVisibilityConverter doesn't refresh the UI in the UserControl #4777

Open
@boriskleynbok

Description

@boriskleynbok

Describe the bug

I have a Page with a UserControl that has a property ViewModel that is created by the DI container.
The BoolToVisibilityConverter does not refresh the UI in the UserControl.

<UserControl
    x:Class="CSA2.Controls.AddEditControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:CSA2.Controls"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i="using:Microsoft.Xaml.Interactivity"
    xmlns:ic="using:Microsoft.Xaml.Interactions.Core"
    xmlns:converters="using:CommunityToolkit.WinUI.UI.Converters"
    mc:Ignorable="d">
    <UserControl.Resources>
        <converters:BoolToObjectConverter x:Key="BoolToVisibilityConverter" TrueValue="Visible" FalseValue="Collapsed"/>
        <converters:BoolToObjectConverter x:Key="InverseBoolToVisibilityConverter" TrueValue="Collapsed" FalseValue="Visible"/>
    </UserControl.Resources>
    <Grid HorizontalAlignment="Left" Margin="0 10 0 0">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <Grid Row="0" VerticalAlignment="Top" Margin="0 0 0 5">
            <StackPanel Orientation="Horizontal">
                <ToggleButton
                    Margin="5 0 0 0"
                    Visibility="{x:Bind ViewModel.IsEditVisible, Mode=TwoWay,
                    Converter={StaticResource BoolToVisibilityConverter}}"
                    Command="{x:Bind ViewModel.AddUserCommand,Mode=OneWay}"
                    IsChecked="{x:Bind ViewModel.IsCreate, Mode=TwoWay}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock x:Uid="CreateNewButtonText" Margin="2 0 5 0" />
                        <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE7C3;" />
                    </StackPanel>
                </ToggleButton>
                <ToggleButton
                    Margin="5 0 0 0"
                    Visibility="{x:Bind ViewModel.IsEditVisible, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,
                    Converter={StaticResource BoolToVisibilityConverter}}"
                    Command="{x:Bind ViewModel.EditUserCommand,Mode=OneWay}"
                    IsChecked="{x:Bind ViewModel.IsEdit, Mode=TwoWay}">
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="Edit" Margin="0 0 5 0" />
                        <FontIcon FontFamily="Segoe MDL2 Assets" Glyph="&#xE70F;" />
                    </StackPanel>
                </ToggleButton>
            </StackPanel>
        </Grid>
        <Grid Row="1" VerticalAlignment="Top" Margin="5 0 0 5"
              Visibility="{x:Bind ViewModel.IsSingleSelection, Mode= TwoWay, UpdateSourceTrigger=PropertyChanged,
              Converter={StaticResource BoolToVisibilityConverter}}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <TextBlock x:Uid="UserNameText"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <TextBox x:Uid="UserNameNullText"
                         Grid.Row="0"
                         Grid.Column="1"
                         IsReadOnly="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay}"
                         Margin="0 0 5 5"
                         Width="250"
                         Height="25"
                         Text="{x:Bind ViewModel.UserName, Mode=TwoWay}" />
                <TextBlock Grid.Row="1" x:Uid="UserEmailText"
                           Grid.Column="0"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <TextBox x:Uid="UserEmailNullText"
                         IsReadOnly="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay}"
                         Margin="0 0 5 5"
                         Grid.Row="1"
                         Grid.Column="1"
                         Width="250"
                         Height="25"
                         Text="{x:Bind ViewModel.UserEmail, Mode= TwoWay}" />
                <TextBlock Grid.Row="2" x:Uid="UserDepartmentText"
                           Grid.Column="0"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <ComboBox Grid.Row="2"
                          Grid.Column="1"
                          Height="30"
                          Visibility="{x:Bind ViewModel.IsReadOnly,Mode=TwoWay,
                          Converter={StaticResource InverseBoolToVisibilityConverter}}"
                          IsEditable="False"
                          Margin="0 0 5 5"
                          HorizontalAlignment="Stretch"
                          VerticalAlignment="Center"
                          ItemsSource="{x:Bind ViewModel.UserDepartments,Mode = OneWay}"
                          SelectedItem="{x:Bind ViewModel.UserDepartment, Mode=TwoWay}" />
                <TextBox x:Uid="UserDepartmentNullText"
                         Grid.Row="2"
                         Grid.Column="1"
                         Visibility="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay,
                         Converter={StaticResource BoolToVisibilityConverter}}"
                         IsReadOnly="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay}"
                         Margin="0 0 5 5"
                         Width="250"
                         Height="25"
                         Text="{x:Bind ViewModel.UserDepartment, Mode= TwoWay}" />
                <TextBlock Grid.Row="3" Text="User Status"
                           Grid.Column="0"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <ComboBox Grid.Row="3"
                          Grid.Column="1"
                          Height="30"
                          Visibility="{x:Bind ViewModel.IsReadOnly,Mode=TwoWay,
                          Converter={StaticResource InverseBoolToVisibilityConverter}}"
                          IsEditable="False"
                          Margin="0 0 5 5"
                          HorizontalAlignment="Stretch"
                          VerticalAlignment="Center"
                          ItemsSource="{x:Bind ViewModel.UserStatus, Mode= OneWay}"
                          SelectedItem="{x:Bind ViewModel.SelectedUserStatus, Mode=TwoWay}" />
                <TextBox Grid.Row="3"
                         Grid.Column="1"
                         Visibility="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay,
                         Converter={StaticResource BoolToVisibilityConverter}}"
                         IsReadOnly="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay}"
                         Margin="0 0 5 5"
                         Width="250"
                         Height="30"
                         Text="{x:Bind ViewModel.SelectedUserStatus, Mode= TwoWay}" />
            </Grid>
            <Grid Grid.Column="1">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock x:Uid="UserRoleText"
                           VerticalAlignment="Top"
                           HorizontalAlignment="Center"
                           Margin="5 0 2 5" />
                <Border Grid.Row="1"
                        Grid.Column="0"
                        BorderThickness=".5"
                        BorderBrush="LightGray"
                        CornerRadius="2">
                    <ListView
                        ItemsSource="{x:Bind ViewModel.SelectedUserRoles, Mode=OneWay}"
                        SelectionMode="None"
                        Visibility="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay,
                        Converter={StaticResource BoolToVisibilityConverter}}"/>
                </Border>
                <Border Grid.Row="1"
                        Grid.Column="0"
                        BorderThickness=".5"
                        BorderBrush="LightGray"
                        CornerRadius="2"
                        Visibility="{x:Bind ViewModel.IsReadOnly,Mode=TwoWay,
                        Converter={StaticResource InverseBoolToVisibilityConverter}}">
                    <ListView x:Name="UserRoles"
                              ItemsSource="{x:Bind ViewModel.UserRoles, Mode=OneWay}"
                              SelectionMode="Multiple"
                              VerticalContentAlignment="Top"
                              ScrollViewer.IsVerticalRailEnabled="True"
                              ScrollViewer.VerticalScrollBarVisibility="Visible">
                        <i:Interaction.Behaviors>
                            <ic:EventTriggerBehavior EventName="SelectionChanged">
                                <ic:InvokeCommandAction
                                    Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                    CommandParameter="{x:Bind UserRoles.SelectedItems,Mode=OneWay}" />
                            </ic:EventTriggerBehavior>
                        </i:Interaction.Behaviors>
                    </ListView>
                </Border>
                <TextBlock Grid.Row="0" Grid.Column="1" x:Uid="UserFunctionsText"
                           VerticalAlignment="Top"
                           HorizontalAlignment="Center"
                           Margin="5 0 2 5" />
                <Border Grid.Row="1"
                        Grid.Column="1"
                        Margin="5 0 0 0"
                        BorderThickness=".5"
                        BorderBrush="LightGray"
                        CornerRadius="2">
                    <ListView
                        ItemsSource="{x:Bind ViewModel.SelectedUserFunctions, Mode=OneWay}"
                        SelectionMode="None"
                        Visibility="{x:Bind ViewModel.IsReadOnly, Mode=TwoWay,
                        Converter={StaticResource BoolToVisibilityConverter}}"/>
                </Border>
                <Border Grid.Row="1"
                        Grid.Column="1"
                        Margin="5 0 0 0"
                        BorderThickness=".5"
                        BorderBrush="LightGray"
                        CornerRadius="2"
                        Visibility="{x:Bind ViewModel.IsReadOnly,Mode=TwoWay,
                        Converter={StaticResource InverseBoolToVisibilityConverter}}">
                    <ListView x:Name="UserFunctions"
                              ItemsSource="{x:Bind ViewModel.UserFunctions, Mode=OneWay}"
                              SelectionMode="Multiple"
                              VerticalContentAlignment="Top"
                              ScrollViewer.IsVerticalRailEnabled="True"
                              ScrollViewer.VerticalScrollBarVisibility="Visible">
                        <i:Interaction.Behaviors>
                            <ic:EventTriggerBehavior EventName="SelectionChanged">
                                <ic:InvokeCommandAction
                                    Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                    CommandParameter="{x:Bind UserFunctions.SelectedItems,Mode=OneWay}" />
                            </ic:EventTriggerBehavior>
                        </i:Interaction.Behaviors>
                    </ListView>
                </Border>
            </Grid>
        </Grid>
        <Grid Grid.Row="1" VerticalAlignment="Top"
              Margin="5 0 0 5"
              Visibility="{x:Bind ViewModel.IsMultiSelection,
              Converter={StaticResource BoolToVisibilityConverter}}">
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Row="0" Text="User Status"
                       Grid.Column="0"
                       VerticalAlignment="Center"
                       Margin="0 0 5 5" />
            <ComboBox Grid.Row="1"
                      Grid.Column="0"
                      Height="30"
                      IsEditable="False"
                      Margin="0 0 5 5"
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Top"
                      ItemsSource="{x:Bind ViewModel.UserStatus, Mode= OneWay}"
                      SelectedItem="{x:Bind ViewModel.SelectedUserStatus, Mode=TwoWay}" />
            <TextBlock x:Uid="UserDepartmentText"
                       Grid.Row="0"
                       Grid.Column="1"
                       VerticalAlignment="Top"
                       HorizontalAlignment="Center"
                       Margin="2 0 5 0"/>
            <Border Grid.Row="1"
                    Grid.Column="1"
                    BorderThickness=".5"
                    BorderBrush="LightGray"
                    CornerRadius="2">
                <ListView x:Name="UserDepartments"
                          ItemsSource="{x:Bind ViewModel.UserDepartments, Mode=TwoWay}"
                          SelectionMode="Single"
                          VerticalContentAlignment="Top"
                          ScrollViewer.IsVerticalRailEnabled="True"
                          ScrollViewer.VerticalScrollBarVisibility="Visible">
                    <i:Interaction.Behaviors>
                        <ic:EventTriggerBehavior EventName="SelectionChanged">
                            <ic:InvokeCommandAction
                                Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                CommandParameter="{x:Bind UserDepartments.SelectedItems,Mode=OneWay}" />
                        </ic:EventTriggerBehavior>
                    </i:Interaction.Behaviors>
                </ListView>
            </Border>
            <TextBlock x:Uid="UserRoleText"
                       Grid.Row="0"
                       Grid.Column="2"
                       VerticalAlignment="Top"
                       HorizontalAlignment="Center"
                       Margin="5 0 2 5" />
            <Border Grid.Row="1"
                    Grid.Column="2"
                    Margin="5 0 0 0"
                    BorderThickness=".5"
                    BorderBrush="LightGray"
                    CornerRadius="2">
                <ListView x:Name="mUserRoles"
                          ItemsSource="{x:Bind ViewModel.UserRoles, Mode=OneWay}"
                          SelectionMode="Multiple"
                          VerticalContentAlignment="Top"
                          ScrollViewer.IsVerticalRailEnabled="True"
                          ScrollViewer.VerticalScrollBarVisibility="Visible">
                    <i:Interaction.Behaviors>
                        <ic:EventTriggerBehavior EventName="SelectionChanged">
                            <ic:InvokeCommandAction
                                Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                CommandParameter="{x:Bind mUserRoles.SelectedItems,Mode=OneWay}" />
                        </ic:EventTriggerBehavior>
                    </i:Interaction.Behaviors>
                </ListView>
            </Border>
            <TextBlock Grid.Row="0" Grid.Column="3" x:Uid="UserFunctionsText"
                       VerticalAlignment="Top"
                       HorizontalAlignment="Center"
                       Margin="5 0 2 5" />
            <Border Grid.Row="1"
                    Grid.Column="3"
                    Margin="5 0 0 0"
                    BorderThickness=".5"
                    BorderBrush="LightGray"
                    CornerRadius="2">
                <ListView x:Name="mUserFunctions"
                          ItemsSource="{x:Bind ViewModel.UserFunctions, Mode=OneWay}"
                          SelectionMode="Multiple"
                          VerticalContentAlignment="Top"
                          ScrollViewer.IsVerticalRailEnabled="True"
                          ScrollViewer.VerticalScrollBarVisibility="Visible">
                    <i:Interaction.Behaviors>
                        <ic:EventTriggerBehavior EventName="SelectionChanged">
                            <ic:InvokeCommandAction
                                Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                CommandParameter="{x:Bind mUserFunctions.SelectedItems,Mode=OneWay}" />
                        </ic:EventTriggerBehavior>
                    </i:Interaction.Behaviors>
                </ListView>
            </Border>
        </Grid>
        <Grid Grid.Row="1" VerticalAlignment="Top"
              Visibility="{x:Bind ViewModel.IsCreateNewUser,
              Converter={StaticResource BoolToVisibilityConverter}}">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
                <TextBlock x:Uid="UserNameText"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <TextBox x:Uid="UserNameNullText"
                         Grid.Row="0"
                         Grid.Column="1"
                         Margin="0 0 5 5"
                         Width="250"
                         Height="25"
                         Text="{x:Bind ViewModel.UserName, Mode=TwoWay}" />
                <TextBlock x:Uid="UserEmailText"
                           Grid.Row="1"
                           Grid.Column="0"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <TextBox x:Uid="UserEmailNullText"
                         Margin="0 0 5 5"
                         Grid.Row="1"
                         Grid.Column="1"
                         Width="250"
                         Height="25"
                         Text="{x:Bind ViewModel.UserEmail, Mode= TwoWay}" />
                <TextBlock x:Uid="UserDepartmentText"
                           Grid.Row="2"
                           Grid.Column="0"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <ComboBox Grid.Row="2"
                          Grid.Column="1"
                          Height="30"
                          IsEditable="False"
                          Margin="0 0 5 5"
                          HorizontalAlignment="Stretch"
                          VerticalAlignment="Center"
                          ItemsSource="{x:Bind ViewModel.UserDepartments, Mode=OneWay}"
                          SelectedItem="{x:Bind ViewModel.UserDepartment, Mode=TwoWay}" />
                <TextBlock Grid.Row="3" Text="User Status"
                           Grid.Column="0"
                           VerticalAlignment="Center"
                           Margin="0 0 5 5" />
                <ComboBox Grid.Row="3"
                          Grid.Column="1"
                          Height="30"
                          IsEditable="False"
                          Margin="0 0 5 5"
                          HorizontalAlignment="Stretch"
                          VerticalAlignment="Center"
                          ItemsSource="{x:Bind ViewModel.UserStatus, Mode= OneWay}"
                          SelectedItem="{x:Bind ViewModel.SelectedUserStatus, Mode=TwoWay}" />
            </Grid>
            <Grid Grid.Column="1">
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>
                <TextBlock x:Uid="UserRoleText"
                           VerticalAlignment="Top"
                           HorizontalAlignment="Center"
                           Margin="5 0 2 5" />
                <Border Grid.Row="1"
                        Grid.Column="0"
                        BorderThickness=".5"
                        BorderBrush="LightGray"
                        CornerRadius="2">
                    <ListView x:Name="cuUserRoles" ItemsSource="{x:Bind ViewModel.UserRoles, Mode=OneWay}"
                              SelectionMode="Multiple"
                              VerticalContentAlignment="Top"
                              ScrollViewer.IsVerticalRailEnabled="True"
                              ScrollViewer.VerticalScrollBarVisibility="Visible">
                        <i:Interaction.Behaviors>
                            <ic:EventTriggerBehavior EventName="SelectionChanged">
                                <ic:InvokeCommandAction
                                    Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                    CommandParameter="{x:Bind cuUserRoles.SelectedItems,Mode=OneWay}" />
                            </ic:EventTriggerBehavior>
                        </i:Interaction.Behaviors>
                    </ListView>
                </Border>
                <TextBlock Grid.Row="0" Grid.Column="1" x:Uid="UserFunctionsText"
                           VerticalAlignment="Top"
                           HorizontalAlignment="Center"
                           Margin="5 0 2 5" />
                <Border Grid.Row="1"
                        Grid.Column="1"
                        Margin="5 0 0 0"
                        BorderThickness=".5"
                        BorderBrush="LightGray"
                        CornerRadius="2">
                    <ListView x:Name="cuUserFunctions"
                              ItemsSource="{x:Bind ViewModel.UserFunctions, Mode=OneWay}"
                              SelectionMode="Multiple"
                              VerticalContentAlignment="Top"
                              ScrollViewer.IsVerticalRailEnabled="True"
                              ScrollViewer.VerticalScrollBarVisibility="Visible">
                        <i:Interaction.Behaviors>
                            <ic:EventTriggerBehavior EventName="SelectionChanged">
                                <ic:InvokeCommandAction
                                    Command="{x:Bind ViewModel.SelectedItemsCommand}"
                                    CommandParameter="{x:Bind cuUserFunctions.SelectedItems,Mode=OneWay}" />
                            </ic:EventTriggerBehavior>
                        </i:Interaction.Behaviors>
                    </ListView>
                </Border>
            </Grid>

        </Grid>
        <StackPanel Orientation="Horizontal" Grid.Row="2" VerticalAlignment="Bottom">
            <Button Margin="0 5 5 0" Command="{x:Bind ViewModel.SubmitCommand}">
                <TextBlock x:Uid="SubmitText" />
            </Button>
            <Button Margin="5 5 0 0" Command="{x:Bind ViewModel.CancelCommand}">
                <TextBlock x:Uid="CancelText" />
            </Button>
        </StackPanel>
    </Grid>
</UserControl>

Regression

No response

Reproducible in sample app?

  • This bug can be reproduced in the sample app.

Steps to reproduce

Create a Page and a ViewModel and bind.
Create a UserControl and bind.
Add UserControl to the Page.

In the UserControl add a BoolToVisibilityConverter to make a Grid Visible or Collapsed based on the Boolean property in the ViewModel of the UserControl.

Expected behavior

Expected for the BoolToVisibilityConverter change Visibility from Collapsed to Visible.

Screenshots

How I want this to apply the BoolToVisibilityConverter
image

Here none of the converters work.
image

Windows Build Number

  • Windows 10 1809 (Build 17763)
  • Windows 10 1903 (Build 18362)
  • Windows 10 1909 (Build 18363)
  • Windows 10 2004 (Build 19041)
  • Windows 10 20H2 (Build 19042)
  • Windows 10 21H1 (Build 19043)
  • Windows 11 21H2 (Build 22000)
  • Other (specify)

Other Windows Build number

No response

App minimum and target SDK version

  • Windows 10, version 1809 (Build 17763)
  • Windows 10, version 1903 (Build 18362)
  • Windows 10, version 1909 (Build 18363)
  • Windows 10, version 2004 (Build 19041)
  • Other (specify)

Other SDK version

Windows 11

Visual Studio Version

No response

Visual Studio Build Number

Version 17.3.0

Device form factor

No response

Nuget packages

communitytoolkit.mvvm \8.0.0
microsoft.extensions.hosting\6.0.1
microsoft.windowsappsdk\1.1.3
communitytoolkit.winui.ui.controls\7.1.2

Additional context

No response

Help us help you

No.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    WinUI 💠Related to WinUI 3 Version or when paired with External can mean requires fix in WinUI 2/3.documentation 📃need more info 📌question ❔Issues or PR require more information

    Type

    No type

    Projects

    • Status

      No status

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions