我在一个中央库中有一个类,它有一个我们用来控制缩放的滑块。我们有一个静态字段,用于设置我们支持的系统范围最大缩放级别。它很重要,因为我们使用该值来强制来自多个缩放路径的范围,我们必须支持具有相同概念的传统WinForms应用程序。
public class ZoomableClass
{
// really integers, but has to be a double to support binding to
// WPF Slider.Maximum
public const double MaxZoomLevel = 19;
}
在XAML中,我天真地认为我应该能够做到以下几点:
<Slider Maximum="{x:Static core:ZoomableClass.MaxZoomLevel}" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type core:ZoomView}}, Path=ViewModel.(core:ZoomViewModel.ZoomLevel)}"/>
除了编辑抱怨之外,当我运行应用程序时,调试日志被卡在Slider.Value
属性中记录绑定失败的循环中。当我将{x:Static}
值更改回常量时,一切都恢复正常。
要解决这个问题并仍然使用常量,我在控制资源中声明了它:
<mvvm:View.Resources>
<ResourceDictionary>
<x:Static Member=core:ZoomableClass.MaxZoomLevel" x:Key="MaxZoomLevel"/>
</ResourceDictionary>
</mvvm:View.Resources>
稍后我将slider属性绑定到静态资源:
<Slider Maximum="{StaticResource MaxZoomLevel}" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type core:ZoomView}}, Path=ViewModel.(core:ZoomViewModel.ZoomLevel)}""/>
这在运行时有效,但设计师抱怨告诉我An object of the type "System.Windows.Markup.StaticExtension" cannot be applied to a property that expects the type "System.Double".
希望设计师问题在更新的版本中得到修复(我们在Visual Studio 2010上),但是当我在设计器中打开该文件时,整个Slider都有那个丑陋的红色&#39; x&#39;对于破碎的控制。我打开一个使用该控件的XAML文件,它渲染得很好。
有人可以向我解释为什么我的第一次尝试不起作用,有没有办法在没有设计师向我抱怨的情况下做到这一点?