none
WPF绑定数据报错 RRS feed

  • 问题

  • 只是想简单的试试绑定数据,怎么就报错了,而且是明白是什么意思。

        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                List<a> obj = new List<a>();
                obj.Add(new a { aa = 1 });
                obj.Add(new a { aa = 2 });
                obj.Add(new a { aa = 3 });
                obj.Add(new a { aa = 4 });
                this.LayoutRoot.DataContext = obj;
                InitializeComponent();
            }
        }

    未处理 System.Reflection.TargetInvocationException
      Message=调用的目标发生了异常。
      Source=mscorlib
      StackTrace:
           在 System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck)
           在 System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache)
           在 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache)
           在 System.Activator.CreateInstance(Type type, Boolean nonPublic)
           在 System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
           在 System.Activator.CreateInstance(Type type, BindingFlags bindingAttr, Binder binder, Object[] args, CultureInfo culture, Object[] activationAttributes)
           在 System.Xaml.Schema.XamlTypeInvoker.CreateInstance(Object[] arguments)
           在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstanceWithCtor(XamlType xamlType, Object[] args)
           在 MS.Internal.Xaml.Runtime.ClrObjectRuntime.CreateInstance(XamlType xamlType, Object[] args)
           在 System.Xaml.XamlObjectWriter.Logic_CreateAndAssignToParentStart(ObjectWriterContext ctx)
           在 System.Xaml.XamlObjectWriter.WriteStartMember(XamlMember property)
           在 System.Xaml.XamlWriter.WriteNode(XamlReader reader)
           在 System.Windows.Markup.WpfXamlLoader.TransformNodes(XamlReader xamlReader, XamlObjectWriter xamlWriter, Boolean onlyLoadOneNode, Boolean skipJournaledProperties, Boolean shouldPassLineNumberInfo, IXamlLineInfo xamlLineInfo, IXamlLineInfoConsumer xamlLineInfoConsumer, XamlContextStack`1 stack, IStyleConnector styleConnector)
           在 System.Windows.Markup.WpfXamlLoader.Load(XamlReader xamlReader, IXamlObjectWriterFactory writerFactory, Boolean skipJournaledProperties, Object rootObject, XamlObjectWriterSettings settings, Uri baseUri)
           在 System.Windows.Markup.WpfXamlLoader.LoadBaml(XamlReader xamlReader, Boolean skipJournaledProperties, Object rootObject, XamlAccessLevel accessLevel, Uri baseUri)
           在 System.Windows.Markup.XamlReader.LoadBaml(Stream stream, ParserContext parserContext, Object parent, Boolean closeStream)
           在 System.Windows.Application.LoadBamlStreamWithSyncInfo(Stream stream, ParserContext pc)
           在 System.Windows.Application.LoadComponent(Uri resourceLocator, Boolean bSkipJournaledProperties)
           在 System.Windows.Application.DoStartup()
           在 System.Windows.Application.<.ctor>b__1(Object unused)
           在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
           在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
           在 System.Windows.Threading.DispatcherOperation.InvokeImpl()
           在 System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state)
           在 System.Threading.ExecutionContext.runTryCode(Object userData)
           在 System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
           在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
           在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           在 System.Windows.Threading.DispatcherOperation.Invoke()
           在 System.Windows.Threading.Dispatcher.ProcessQueue()
           在 System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           在 MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
           在 MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
           在 System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
           在 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
           在 System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
           在 MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
           在 MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
           在 System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
           在 System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
           在 System.Windows.Application.RunDispatcher(Object ignore)
           在 System.Windows.Application.RunInternal(Window window)
           在 System.Windows.Application.Run(Window window)
           在 System.Windows.Application.Run()
           在 WpfApplication1.App.Main() 位置 C:\Users\jaycee.pang\Documents\Visual Studio 2010\Projects\WpfApplication1\WpfApplication1\obj\x86\Debug\App.g.cs:行号 0
           在 System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
           在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
           在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
           在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
           在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           在 System.Threading.ThreadHelper.ThreadStart()
      InnerException: System.NullReferenceException
           Message=未将对象引用设置到对象的实例。
           Source=WpfApplication1
           StackTrace:
                在 WpfApplication1.MainWindow..ctor() 位置 C:\Users\jaycee.pang\Documents\Visual Studio 2010\Projects\WpfApplication1\WpfApplication1\MainWindow.xaml.cs:行号 33
           InnerException: 

    2012年12月13日 8:47

答案

  • "{Binding Path= DataContext}"  改成"{Binding}" ,因为 DataContext 就是数据源,所以 Path 是当前,再指定 Path = DataContext,它就会去 DataContext 上找 DataContext 属性。

    • 已标记为答案 柯小南 2012年12月14日 3:20
    2012年12月14日 3:05

全部回复

  •             Binding binding = new Binding();
                //设置源对象
                binding.Source = obj;
                //设置源属性
                binding.Path = new PropertyPath("aa");
                //添加到目标属性
                this.dataGrid1.SetBinding(TextBlock.TextProperty, binding);

    这样绑还是一样的错误。

    2012年12月13日 9:09
  • public MainWindow()
    {

    InitializeComponent();

    List<a> obj = new List<a>();
    obj.Add(new a { aa = 1 });
    obj.Add(new a { aa = 2 });
    obj.Add(new a { aa = 3 });
    obj.Add(new a { aa = 4 });

    this.DataContext = obj;
    }

    然后在 XMAL 中,你可以把 dataGrid 的datasource  Binding Path = DataContext.

    2012年12月13日 9:21
  • 嗯,不报错了。不过这样绑定的在dataGrid上还是出不来啊?

    我XAML是这样的。一阵蛋蛋的忧伤,哎~

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <Grid  Name="LayoutRoot">
            <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path= DataContext}" Height="200" HorizontalAlignment="Left" Margin="157,97,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200">
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding  Path= name}" Header="名字"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Window>

    2012年12月13日 9:47
  • Binding Path= name

    你看下这里的 name 是不是 List<a> 中 a 的属性?

    2012年12月14日 1:44
  • 是的。我简化成如下这样还是无显示。

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
            <DataGrid AutoGenerateColumns="True" ItemsSource="{Binding Path= DataContext}" Height="200" HorizontalAlignment="Left" Margin="157,97,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="200">
            </DataGrid>
    </Window>

    2012年12月14日 1:52
  • "{Binding Path= DataContext}"  改成"{Binding}" ,因为 DataContext 就是数据源,所以 Path 是当前,再指定 Path = DataContext,它就会去 DataContext 上找 DataContext 属性。

    • 已标记为答案 柯小南 2012年12月14日 3:20
    2012年12月14日 3:05
  • SOGA,终于成了。
    2012年12月14日 3:20
  • 为什么            this.DataContext = obj;  这样是对的,
                this.dataGrid1.DataContext = obj;  这样就会报错呢?
    2012年12月14日 3:22
  • 为什么            this.DataContext = obj;  这样是对的,
                this.dataGrid1.DataContext = obj;  这样就会报错呢?

    会报错吗?我测试了没问题哦。

    另外,你说的和我回答的都不是正确的使用方式,要正确使用绑定,请学习下 MVVM 模式。

    2012年12月14日 7:04
  • 是报错的啊,错误信息就是一楼那个,环境是VS2010。

    嗯,我知道要用MVVM,只是没用过WPF。

    2012年12月14日 8:20