Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法通过XAML设置DataContext,但可以通过代码设置_C#_Wpf_Xaml_Datacontext - Fatal编程技术网

C# 无法通过XAML设置DataContext,但可以通过代码设置

C# 无法通过XAML设置DataContext,但可以通过代码设置,c#,wpf,xaml,datacontext,C#,Wpf,Xaml,Datacontext,在XAML中声明Datacontext时,它不起作用。但如果在代码中设置,则同样有效 详细分析 我的XAML <Window x:Class="SimpleDatabindingwithclass.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xam

在XAML中声明Datacontext时,它不起作用。但如果在代码中设置,则同样有效

详细分析

我的XAML

    <Window x:Class="SimpleDatabindingwithclass.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" Name="windo">
    <Grid DataContext="{Binding ElementName=windo,Path=objectOfStudent}">
    <Grid.RowDefinitions>
        <RowDefinition Height="*"></RowDefinition>
    </Grid.RowDefinitions>
    <TextBox Grid.Row="0" Margin="25" Height="25" Width="100" HorizontalAlignment="Left" Name="TextBox1" Text="{Binding Path=StudentName}"></TextBox>

</Grid>
</Window>
在MainWindow()中,应用程序可以工作!
你认为问题是什么?

这是因为你试图通过XAML使用名为
objectOfStudent
局部变量-这在XAML上下文中没有意义。XAML只接受字段和属性,不接受局部变量。

这是因为您试图通过XAML使用名为
objectOfStudent
局部变量-这在XAML上下文中没有任何意义。XAML只接受字段和属性,不接受局部变量。

绑定只适用于公共属性,不能绑定到某些局部变量。将学生的
objectOfStudent
作为
主窗口的公共属性

编辑:

编辑:

您还需要在
main窗口
Student
类中实现接口,并在设置属性时引发
PropertyChanged
。这是正确的方法,每次更改属性时都会更新绑定。或者一种简单的方法:在调用
InitializeComponent
之前创建学生的
对象

public MainWindow()
{
    objectOfStudent = new Student();
    objectOfStudent.StudentName = "John diley";
    objectOfStudent.Address = "20, North Travilia, Washington DC.";
    InitializeComponent();
    //not setting datacontext here since i set that in xaml
 }

绑定仅适用于公共属性,不能绑定到某些局部变量。将学生的
objectOfStudent
作为
主窗口的公共属性

编辑:

编辑:

您还需要在
main窗口
Student
类中实现接口,并在设置属性时引发
PropertyChanged
。这是正确的方法,每次更改属性时都会更新绑定。或者一种简单的方法:在调用
InitializeComponent
之前创建学生的
对象

public MainWindow()
{
    objectOfStudent = new Student();
    objectOfStudent.StudentName = "John diley";
    objectOfStudent.Address = "20, North Travilia, Washington DC.";
    InitializeComponent();
    //not setting datacontext here since i set that in xaml
 }

这是否意味着我不能在XAML中使用类的对象?如何将其移植到XAML,而不是将其放入n代码?对不起,如果这听起来很傻,但这让我有点害怕!你可以将一个名为“Student”的属性添加到你的Window类中,该类返回一个Student insatnce,然后使用它而不是“objectOfStudent”这是否意味着我不能在XAML中使用类的对象?我如何将其移植到XAML而不是将其放入n代码?抱歉,如果这听起来很傻,但这让我有点吃惊!你可以添加一个名为“Student”的属性“Student”返回窗口类,该窗口类返回一个Student insatnce,然后使用它来代替“objectOfStudent”,谢谢Zabasky。我知道objectofStudent与班级学生有关,是一个局部变量。现在,我如何使它成为MainWindow的属性?简单地说,如何添加属性并将其引用到学生实例?这仍然不起作用!仍然两个文本字段都是空的!在添加了Student{get;set;}的公共Student对象之后,我在上面的XAML代码中使用了它。还是没弄对。无论如何,问题的定义很清楚。@Madhuresh要找到正确的方法,请阅读更多关于INotifyPropertyChanged接口及其用途的信息。谢谢Zabasky。我知道objectofStudent与班级学生有关,是一个局部变量。现在,我如何使它成为MainWindow的属性?简单地说,如何添加属性并将其引用到学生实例?这仍然不起作用!仍然两个文本字段都是空的!在添加了Student{get;set;}的公共Student对象之后,我在上面的XAML代码中使用了它。还是没弄对。无论如何,问题的定义是明确的。@Madhuresh要找到正确的方法,只需阅读更多关于INotifyPropertyChanged接口及其用途的信息。
public Student objectOfStudent { get; set; }

public MainWindow()
{
    InitializeComponent();
    objectOfStudent = new Student();
    objectOfStudent.StudentName = "John diley";
    objectOfStudent.Address = "20, North Travilia, Washington DC.";
    //not setting datacontext here since i set that in xaml
 }
public MainWindow()
{
    objectOfStudent = new Student();
    objectOfStudent.StudentName = "John diley";
    objectOfStudent.Address = "20, North Travilia, Washington DC.";
    InitializeComponent();
    //not setting datacontext here since i set that in xaml
 }