web-dev-qa-db-ja.com

BooleanToVisibilityConverterを使用したWPF MVVM非表示ボタン

私のWPFアプリケーションでは、ユーザーが選択したオプションに応じてボタンの可視性を変更しようとしています。ロード時には、ボタンの1つが表示されないようにします。組み込みの値コンバーターBooleanToVisibilityConverterを使用しています。ただし、ロード時にボタンが表示されるため、機能していません。プロパティをtrueとfalseの両方に変更しましたが、違いはありません。以下は私のコードです、私が見逃しているものを見ることができませんか?

ビューモデルのプロパティ

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

私のapp.xamlで

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

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

初心者の場合、コマンドを使用している場合、IsEnabledをバインドする必要はありません。コマンド実装がこれを決定する必要があります。

第二に、ViewModelのViewへのバインドは少し後の段階で発生する傾向があるため、次のようにバインドのデフォルト値も設定するのが最善です

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

第三に、マイクが指摘したように、ViewModelとViewは2つの別個のクラスであるため、プロパティがパブリックであることを確認してください。

40

コンバーターを使用する代わりに、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>

ViewModelのプロパティをpublicに更新します

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

そして、MainWindowのDataContextがViewModelに設定されていることを確認してください。

7
d.moncada