如何摆脱 DataContext InitializeComponent 中的 StackOverflow 异常? [英] How to get rid of StackOverflow Exception in DataContext InitializeComponent?
问题描述
我是 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
如果你使用 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屋!