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

时间:2016-06-24 10:33:22

标签: c# wpf binding static-members xaml-designer

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

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

问题在于此类评估也在设计时起作用,因此很难与设计师合作。

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

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

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

3 个答案:

答案 0 :(得分:2)

你可以在转换器中,在静态CurrentIsAdministractor(错误在这里?)属性中check if you're in design mode,只返回您想要查看的任何州

编辑:

这里有一些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}"

答案 1 :(得分: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}}">

答案 2 :(得分:0)

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

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

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