代码之家  ›  专栏  ›  技术社区  ›  Eric Schoonover thSoft

ValueConverter上的依赖属性

  •  3
  • Eric Schoonover thSoft  · 技术社区  · 14 年前

    使用Silverlight4,我正在尝试通过引用我的控件中的一个对象来初始化UserControl的Resources部分中的转换器。当我尝试运行应用程序时,我得到了这个异常,注意实际XAML文件中的第16行是converter:pointconverter….线:

    System.Windows.Markup.XamlParseException: 2260 An error has occurred. [Line: 16 Position: 58]
        at System.Windows.Application.LoadComponent(Object component, Uri resourceLocator)
        at WheresMyCar.View.Map.InitializeComponent()
        at WheresMyCar.View.Map..ctor()
        at System.Reflection.RuntimeConstructorInfo.InternalInvoke(RuntimeConstructorInfo rtci, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)  
        at System.Reflection.RuntimeConstructorInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)    
        at System.Activator.InternalCreateInstance(Type type, Boolean nonPublic, StackCrawlMark& stackMark) 
        at System.Activator.CreateInstance(Type type)  
        at System.Windows.Navigation.PageResourceContentLoader.BeginLoad_OnUIThread(AsyncCallback userCallback, PageResourceContentLoaderAsyncResult result)  
        at System.Windows.Navigation.PageResourceContentLoader.<>c__DisplayClass4.<BeginLoad>b__0(Object args)    
        at System.Reflection.RuntimeMethodInfo.InternalInvoke(RuntimeMethodInfo rtmi, Object obj, BindingFlags invokeAttr, Binder binder, Object parameters, CultureInfo culture, Boolean isBinderDefault, Assembly caller, Boolean verifyAccess, StackCrawlMark& stackMark)    
        at System.Reflection.RuntimeMethodInfo.InternalInvoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, StackCrawlMark& stackMark)    at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)    at System.Delegate.DynamicInvokeImpl(Object[] args)    
        at System.Delegate.DynamicInvoke(Object[] args)    
        at System.Windows.Threading.DispatcherOperation.Invoke() 
        at System.Windows.Threading.Dispatcher.Dispatch(DispatcherPriority priority)    
        at System.Windows.Threading.Dispatcher.OnInvoke(Object context)    
        at System.Windows.Hosting.CallbackCookie.Invoke(Object[] args)    
        at System.Windows.Hosting.DelegateWrapper.InternalInvoke(Object[] args)    
        at System.Windows.RuntimeHost.ManagedHost.InvokeDelegate(IntPtr pHandle, Int32 nParamCount, ScriptParam[] pParams, ScriptParam& pResult)
    

    XAML:

    <UserControl.Resources>
        <converter:PointConverter x:Key="pointConverter" Map="{Binding ElementName=ThingMap}" />
    </UserControl.Resources>
    <Grid>
        <m:Map
            x:Name="ThingMap" />
    </Grid>
    

    点转换器类:

    public class PointConverter :
        DependencyObject,
        IValueConverter
    {
        public Microsoft.Maps.MapControl.Map Map
        {
            get { return (Microsoft.Maps.MapControl.Map)GetValue(MapProperty); }
            set { SetValue(MapProperty, value); }
        }
    
        // Using a DependencyProperty as the backing store for Map.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MapProperty =
            DependencyProperty.Register("Map", typeof(Microsoft.Maps.MapControl.Map), typeof(PointConverter), null);
    
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string param = (string)parameter;
    
            Microsoft.Maps.MapControl.Location location = value as Microsoft.Maps.MapControl.Location;
            if (location != null)
            {
                Point point = Map.LocationToViewportPoint(location);
                if (string.Compare(param.ToUpper(), "X") == 0)
                    return point.X;
                else if (string.Compare(param.ToUpper(), "Y") == 0)
                    return point.Y;
                return point;
            }
    
            return null;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
    
    1 回复  |  直到 14 年前
        1
  •  2
  •   Adam Sills    14 年前

    2260是Ag eu e_Parser_Bad_参数值

    这是Silverlight的奇迹之一:完全没有有用的错误消息。

    所以…这是我在Silverlight2和3中找到的东西,我很惊讶你在4中看到它。你100%是在SL4吗?

    将PointConverter更改为从FrameworkElement继承,而不是从DependencyObject继承。我希望这样做之后它会起作用。

    如果在这之后它仍然有效,我会感到困惑,因为SL4应该使用DependencyObject进行数据绑定,而不是SL3和SL2使用的FrameworkElement。