我拥有的是一个具有IsReadOnly属性的对象。如果此属性为true,我想将按钮上的IsEnabled属性设置为false(例如)。

我愿意相信我可以像IsEnabled="{绑定路径=!IsReadOnly}”,但这与WPF不兼容。

我是否不得不经历所有的样式设置?对于将一个bool值设置为另一个bool值的倒数这样简单的事情来说,似乎太啰嗦了。

<Button.Style>
    <Style TargetType="{x:Type Button}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="True">
                <Setter Property="IsEnabled" Value="False" />
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsReadOnly}" Value="False">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Button.Style>

当前回答

在@Paul的回答之后,我在ViewModel中写了以下内容:

public bool ShowAtView { get; set; }
public bool InvShowAtView { get { return !ShowAtView; } }

我希望在这里有一个片段可以帮助到一些人,可能是像我这样的新手。 如果有错误,请告诉我!

顺便说一句,我也同意@heltonbiker的评论——如果你不用使用它超过3次,这绝对是正确的方法……

其他回答

这个方法也适用于可为空的bool。

 [ValueConversion(typeof(bool?), typeof(bool))]
public class InverseBooleanConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (targetType != typeof(bool?))
        {
            throw new InvalidOperationException("The target must be a nullable boolean");
        }
        bool? b = (bool?)value;
        return b.HasValue && !b.Value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return !(value as bool?);
    }

    #endregion
}

我使用类似于@Ofaim的方法

private bool jobSaved = true;
private bool JobSaved    
{ 
    get => jobSaved; 
    set
    {
        if (value == jobSaved) return;
        jobSaved = value;

        OnPropertyChanged();
        OnPropertyChanged("EnableSaveButton");
    }
}

public bool EnableSaveButton => !jobSaved;

我建议使用https://github.com/JohannesMoersch/QuickConverter

反转一个布尔值就像这样简单: <Button IsEnabled="{qc:正在绑定'!$P', P={正在绑定IsReadOnly}}" />

这加快了编写转换器通常所需的时间。

在@Paul的回答之后,我在ViewModel中写了以下内容:

public bool ShowAtView { get; set; }
public bool InvShowAtView { get { return !ShowAtView; } }

我希望在这里有一个片段可以帮助到一些人,可能是像我这样的新手。 如果有错误,请告诉我!

顺便说一句,我也同意@heltonbiker的评论——如果你不用使用它超过3次,这绝对是正确的方法……

在视图模型中再添加一个属性,它将返回反向值。 然后把它绑定到按钮上。 像;

视图模型:

public bool IsNotReadOnly{get{return !IsReadOnly;}}

在xaml:

IsEnabled="{Binding IsNotReadOnly"}