web-dev-qa-db-fra.com

WPF MVVM masquant le bouton à l'aide de BooleanToVisibilityConverter

Dans mon application WPF, j'essaie de changer la visibilité d'un bouton en fonction des options choisies par un utilisateur. Lors du chargement, je souhaite que l'un des boutons ne soit pas visible. J'utilise le convertisseur de valeur intégré BooleanToVisibilityConverter. Cependant, cela ne fonctionne pas car le bouton apparaît au moment du chargement. J'ai changé la propriété en vrai et en faux, cela ne fait aucune différence. Ci-dessous mon code, je ne vois pas ce qui me manque?

La propriété dans mon modèle d'affichage

 bool ButtCancel
    {
        get { return _buttCancel; }
        set
        {
            _buttCancel = value;
            OnPropertyChanged("ButtCancel");
        }
    }

Dans mon app.xaml

 <Application.Resources>       
    <BooleanToVisibilityConverter x:Key="BoolToVis"/>

Dans mon MainWindow.xaml

 <Button Grid.Column="2" 
      Command="{Binding CommandButtProgressCancel}" 
      Content="Cancel" 
      Visibility="{Binding ButtCancel, Converter={StaticResource BoolToVis}}"
      IsEnabled="{Binding ButtCancelEnabled}" 
      Height="50" Width="120" 
      HorizontalAlignment="Center" 
      VerticalAlignment="Center" Margin="0,0,50,20"/>
23
mHelpMe

Pour commencer, si vous utilisez une commande, vous n'avez pas besoin de lier IsEnabled, l'implémentation de la commande devrait en décider.

Deuxièmement, la liaison d'un ViewModel à une vue a tendance à se produire à un stade ultérieur, il est donc préférable de définir également une valeur par défaut pour la liaison, comme par exemple

Visibility="{Binding ButtCancel, Converter={StaticResource BoolToVis}, FallbackValue=Hidden}"

Troisièmement, comme Mike l'a souligné, assurez-vous que votre propriété est publique, car le ViewModel et le View sont deux classes distinctes.

40
Stefan Z Camilleri

Au lieu d'utiliser un convertisseur, vous pouvez simplement utiliser un DataTrigger.

<Button Grid.Column="2" Command="{Binding CommandButtProgressCancel}" Content="Cancel" 
        Visibility="{Binding ButtCancel, Converter={StaticResource BoolToVis}}" 
        IsEnabled="{Binding ButtCancelEnabled}" Height="50" Width="120"
        HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,50,20">
    <Button.Style>
        <Style TargetType={X:Type Button}>
            <!-- This would be the default visibility -->
            <Setter Property="Visibility" Value="Visible" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding ButtCancel, UpdateSourceTrigger=PropertyChanged}" Value="True">
                    <Setter Property="Visibility" Value="Hidden" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Mettez à jour les propriétés de votre ViewModel en public

public bool ButtCancel
{
    get { return _buttCancel; }
    set
    {
        _buttCancel = value;
        OnPropertyChanged("ButtCancel");
    }
}

Et assurez-vous que le DataContext de votre MainWindow est défini sur ViewModel.

7
d.moncada