WPF MVVM hiding button using BooleanToVisibilityConverter

dans mon application WPF j'essaie de changer la visibilité d'un bouton en fonction des options choisies par un utilisateur. En charge, je veux que l'un des boutons ne soit pas visible. J'utilise le convertisseur de valeur booleantovisibilityconverter. Cependant il ne fonctionne pas, le bouton apparaît au moment du chargement. J'ai changé la propriété à la fois vrai et faux, ne fait aucune différence. Voici mon code, je ne vois pas ce que je rate?

la propriété à mon avis Modèle

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

Dans mon application.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"/>
21
demandé sur kmote 2013-12-13 19:31:03

2 réponses

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

Deuxièmement, la liaison D'un modèle de vue à une vue a tendance à se produire un peu plus tard, il est donc préférable de définir également une valeur par défaut pour la liaison, comme so

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

Troisièmement, comme Mike l'a souligné, assurez-vous que votre propriété est publique, puisque le modèle de vue et la vue sont deux classes distinctes.

36
répondu Stefan Z Camilleri 2013-12-13 16:13:41

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

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

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

7
répondu d.moncada 2013-12-13 15:56:46