如何摆脱 DataContext InitializeComponent 中的 StackOverflow 异常? [英] How to get rid of StackOverflow Exception in DataContext InitializeComponent?

查看:12
本文介绍了如何摆脱 DataContext InitializeComponent 中的 StackOverflow 异常?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我是 wpf c# 的新手,正在尝试一些示例应用程序,问题是当我在 xaml 中提到 DataContext 时,InitializeComponent 被递归调用并显示

<块引用>

在 mscorlib.dll 中发生 System.StackOverflowException'

这是我的 XAML 标记:

</按钮></StackPanel><数据网格名称="myGridView" 边距="5,69,5,5"宽度="自动" AutoGenerateColumns="真"AlternatingRowBackground="Bisque"><DataGrid.Columns><DataGridTextColumn Header="名称"绑定="{绑定路径=EmpName}"宽度="*" IsReadOnly="True"/><DataGridTextColumn Header="ID"绑定="{绑定路径=EmpId}"宽度="*" IsReadOnly="True"/><DataGridTextColumn Header="Place"绑定="{绑定路径=位置}"宽度="*" IsReadOnly="假"/><DataGridTextColumn Header="部门"绑定="{绑定路径=部门}"宽度="*" IsReadOnly="True"/></DataGrid.Columns></DataGrid></网格></GroupBox></网格></窗口>

XAML.cs:

 private ICommand m_ButtonCommand;公共 ICommand ButtonCommand{得到 { 返回 m_ButtonCommand;}设置 { m_ButtonCommand = 值;}}公共主窗口(){初始化组件();ButtonCommand = new RelayCommand(new Action(ShowEmployees));}

解决方案

如果你使用 xaml.cs 中的属性,你不需要提供数据上下文,因为它是同一个部分类

当您将数据上下文设置为 MainWindow 时,它会创建 MainWindow 的另一个实例并尝试将其数据上下文设置为 MainWindow.因此,进入一个无限循环,给出 stackoverflow 异常.

详细了解 codeproject 中的 DataContext 属性WPF 中的 DataContext

如果您使用另一个类作为视图模型,那么您需要通过定位器提供数据上下文

和定位器将成为 Resources.xaml 中的资源

 

您可以在 geekchamp 使用来自 MVVM-Light 的简单 ViewModelLocator

I am new to wpf c#, trying some sample application, the problem is when I mention DataContext in xaml the InitializeComponent is called recursively and is showing

System.StackOverflowException' occurred in mscorlib.dll

This is my XAML markup:

<Window x:Class="Company1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Company1"
    Title="MainWindow" Height="350" Width="525" >
<Window.DataContext>
   <local:MainWindow/>
</Window.DataContext>
  <Grid>
     <GroupBox Margin="5,5,5,5" Background="Beige">
         <Grid>
             <StackPanel>
                <Button Width="80" Height="25" Margin="10,10,10,10" 
                        Content="Employee" Command="{Binding ButtonCommand}"
                        DataContext="{Binding }">
                </Button>
            </StackPanel>
            <DataGrid 
                  Name="myGridView" Margin="5,69,5,5" 
                  Width="Auto" AutoGenerateColumns="True"
                  AlternatingRowBackground="Bisque">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Name"
                                        Binding="{Binding Path=EmpName}" 
                                        Width="*" IsReadOnly="True"/>
                    <DataGridTextColumn Header="ID" 
                                        Binding="{Binding Path=EmpId}" 
                                        Width="*" IsReadOnly="True"/>
                    <DataGridTextColumn Header="Place" 
                                        Binding="{Binding Path=Location}" 
                                        Width="*" IsReadOnly="False"/>
                    <DataGridTextColumn Header="Dept" 
                                        Binding="{Binding Path=Department}" 
                                        Width="*" IsReadOnly="True"/>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </GroupBox>
</Grid>
</Window>

XAML.cs:

 private ICommand m_ButtonCommand;
 public ICommand ButtonCommand
 {
     get { return m_ButtonCommand; }
     set { m_ButtonCommand = value; }
 }
 public MainWindow()
 {
     InitializeComponent();
     ButtonCommand = new RelayCommand(new Action<object>(ShowEmployees));
 }

解决方案

U don't need to provide data context if you are using the properties in xaml.cs as it is the same partial class

When you set the data context as the MainWindow it creates another instance of MainWindow and tries to set its data context as MainWindow. Thus, going in an infinite loop giving stackoverflow exception.

Learn more about DataContext property in codeproject DataContext in WPF

if you are using another class for view model, then you need to provide data context via a locator

<Window x:Class="Company1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Company1"   
    Title="MainWindow" Height="350" Width="525"
    DataContext={Binding Path=MainWindowViewModel, StaticResource locator} >

and locator will be a resource in Resources.xaml as

 <MVVM:MainPageViewModelLocator x:Key="locator" />

You can get the locator class and more details about the MVVM pattern in geekchamp Working with a simple ViewModelLocator from MVVM-Light

这篇关于如何摆脱 DataContext InitializeComponent 中的 StackOverflow 异常?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆