在设计时禁用绑定到静态 属性

Disable binding to static property during design-time

我喜欢尽可能地绑定到静态属性(例如,当不需要通知时或者当模型无论如何实现 INotifyPropertyChanged 用于其他目的时),例如:

Visibility="{Binding IsAdministractor, Source={x:Static local:User.Current}, Converter={local:FalseToCollapsedConverter}}"

问题是这种评估在设计时也有效,因此很难与设计师合作。

普通绑定在设计时不起作用,我可以利用 FallbackValue 指定 仅设计时值(我从未使用过 FallbackValue 在 运行 时间)。

有没有一种简单的方法可以在设计时使绑定到静态属性无效(禁用它们)?

我可以暂时重命名属性,例如IsAdministrator123,但这很乏味。

您可以 check if you're in design mode 在转换器或静态 CurrentIsAdministractor(这里有错字?)属性 并且只是 return任何你想看到的状态。

编辑:

这是 MarkupExtension 的一些代码(未测试)

public class BindingWithDesignSupport : MarkupExtension
{
    public BindingWithDesignSupport(){}

    public BindingWithDesignSupport(BindingBase binding)
    {
        Binding = binding;
    }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return DesignerProperties.GetIsInDesignMode(new DependencyObject()) ? DesignTimeValue : Binding.ProvideValue(serviceProvider);
    }

    public BindingBase Binding { get; set; }

    public object DesignTimeValue { get; set; }
}

您应该可以像这样使用它:

Visibility="{BindingWithDesignSupport {Binding IsAdministractor, Source={x:Static local:User.Current}, Converter={local:FalseToCollapsedConverter}},DesignTimeValue=Visibility.Visible}"

可以将转换器附加到所有此类属性,这些属性具有 FallbackValue(在设计时使用)和 Converter(提供 运行 时转换器)属性:

public class RuntimeConverter : MarkupExtension, IValueConverter
{
    public object FallbackValue { get; set; }
    public IValueConverter Converter { get; set; }

    public RuntimeConverter() { }

    public override object ProvideValue(IServiceProvider serviceProvider) => this;

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            return FallbackValue;
        if (Converter == null)
            return value;
        return Converter.Convert(value, targetType, parameter, culture);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            return FallbackValue;
        if (Converter == null)
            return value;
        return Converter.ConvertBack(value, targetType, parameter, culture);
    }
}

然后在设计时可以更改 static 属性:

返回的值
<!-- split in multiple lines for readability -->
Visibility="{Binding IsPowerUser, Source={x:Static local:User.Logged},
    Converter={local:RuntimeConverter Converter={local:FalseToCollapsedConverter},
    FallbackValue=Collapsed}}">

您可以使用设计时数据将设计时视图模型置于您要针对其进行设计的状态。

或者对于简单的属性,您可以在视图模型中使用所需的设计时值对其进行初始化,例如

    public bool IsAdministractor { get; set; } = true;