2

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

在 mscorlib.dll 中发生 System.StackOverflowException'

这是我的 XAML 标记:

<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));
 }
4

2 回答 2

4

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

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

了解有关WPF 中 codeproject DataContext 中的DataContext 属性的更多信息

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

<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} >

定位器将是 Resources.xaml 中的资源

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

您可以在 geekchamp 中获取定位器类和有关 MVVM 模式的更多详细信息使用来自 MVVM-Light 的简单 ViewModelLocator

于 2013-01-04T07:46:26.590 回答
1

DataContext 属性描述如下:

一个直接嵌入的对象,用作父元素内任何绑定的数据上下文。通常,此对象是一个 Binding 或另一个 BindingBase 派生类。或者,任何用于绑定的 CLR 对象类型的原始数据都可以放在此处,实际绑定稍后定义。

在您的 XAML 中,您的主窗口的 DataContext 是......您的主窗口。因此,创建了主窗口的另一个实例。其中有一个 DataContext 类型......你的主窗口。

因此,创建了主窗口的另一个实例。其中有一个 DataContext 类型......你的主窗口。

因此,创建了主窗口的另一个实例。其中有一个 DataContext 类型......你的主窗口。

因此,创建了主窗口的另一个实例。其中有一个 DataContext 类型......你的主窗口。

所以 ...

;)

将 DataContext 设置为包含要绑定窗口的数据的对象,而不是窗口本身。

希望这可以帮助

于 2013-01-04T07:03:37.630 回答