我喜欢尽可能绑定到静态属性(例如,当不需要通知或模型时为了其他目的而实现INotifyPropertyChanged
),例如:
Visibility="{Binding IsAdministractor, Source={x:Static local:User.Current}, Converter={local:FalseToCollapsedConverter}}"
问题在于此类评估也在设计时起作用,因此很难与设计师合作。
普通绑定在设计时没有用,我可以利用FallbackValue
指定仅设计时值(我从未使用过FallbackValue
运行时)。
在设计时是否有一种简单的方法可以使静态属性绑定无效(禁用它们)?
我可以暂时重命名属性,例如IsAdministrator123
,但这很乏味。
答案 0 :(得分:2)
你可以在转换器中,在静态Current
或IsAdministractor
(错误在这里?)属性中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;