4

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

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

问题是这样的评估也在设计时起作用,这使得与设计师合作变得很困难。

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

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

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

4

3 回答 3

2

您可以在 Converter 或 static或(typo here?) 属性中检查您是否处于设计模式,然后返回您希望看到的任何状态。CurrentIsAdministractor

编辑:

这是 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}"
于 2016-06-24T10:39:55.597 回答
0

可以将转换器附加到所有此类属性,这些属性具有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);
    }
}

然后在设计时可以更改静态属性返回的值:

<!-- split in multiple lines for readability -->
Visibility="{Binding IsPowerUser, Source={x:Static local:User.Logged},
    Converter={local:RuntimeConverter Converter={local:FalseToCollapsedConverter},
    FallbackValue=Collapsed}}">
于 2016-06-24T11:48:23.767 回答
0

您可以使用设计时数据将设计时视图模型置于您想要设计的状态。

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

    public bool IsAdministractor { get; set; } = true;
于 2018-02-10T16:26:49.843 回答