当前位置: 首页 > 知识库问答 >
问题:

在WPF中设置XAML中的DataContext

哈烨熠
2023-03-14

我有以下代码:

MainWindow.xaml

<Window x:Class="SampleApplication.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"
        DataContext="{Binding Employee}">
    <Grid>       
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="200" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="ID:"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Name:"/>
        <TextBox Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding EmpID}" />
        <TextBox Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding EmpName}" /> 
    </Grid>
</Window>

Employee.cs

namespace SampleApplication
{
    public class Employee
    {
        public Employee()
        {
            EmployeeDetails employeeDetails = new EmployeeDetails();
            employeeDetails.EmpID = 123;
            employeeDetails.EmpName = "ABC";
        }
    }

    public class EmployeeDetails
    {
        private int empID;
        public int EmpID
        {
            get
            {
                return empID;
            }
            set
            {
                empID = value;
            }
        }

        private string empName;
        public string EmpName
        {
            get
            {
                return empName;
            }
            set
            {
                empName = value;
            }
        }
    }
}

这是非常简单的代码,我只想将我的 Employee.cs 类中的 EmpIDEmpName 属性绑定到 MainWindow.xaml 中文本框的文本属性,但在运行代码时,这些文本框中没有出现任何内容。绑定正确吗?

共有3个答案

锺离慈
2023-03-14

这里有几个问题。

  1. 不能将 DataContext 指定为 DataContext=“{Binding Employee}”,因为它是一个复杂的对象,不能作为字符串分配。所以你必须使用
   <Window.DataContext>
      <local:Employee/>
   </Window.DataContext>

要知道,您正在创建Employee类的一个新实例,并将其指定为数据上下文对象。默认构造函数中可能没有任何内容,所以不会显示任何内容。但是如何在文件后的代码中管理它呢?您已经对DataContext进行了类型转换。

    private void my_button_Click(object sender, RoutedEventArgs e)
    {
        Employee e = (Employee) DataContext;
    }

第二种方法是在文件本身的代码中分配数据上下文。优点是你的代码隐藏文件已经知道它并且可以使用它。

public partial class MainWindow : Window
{
   Employee employee = new Employee();

   public MainWindow()
   {
       InitializeComponent();

       DataContext = employee;
   }
}

傅正阳
2023-03-14

首先,您应该在employee类中创建带有员工详细信息的属性:

public class Employee
{
    public Employee()
    {
        EmployeeDetails = new EmployeeDetails();
        EmployeeDetails.EmpID = 123;
        EmployeeDetails.EmpName = "ABC";
    }

    public EmployeeDetails EmployeeDetails { get; set; }
}

如果不这样做,您将在 Employee 构造函数中创建对象的实例,并且您将失去对它的引用。

在XAML中,您应该创建Employee类的实例,然后可以将其分配给DataContext

XAML 应如下所示:

<Window x:Class="SampleApplication.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"
    xmlns:local="clr-namespace:SampleApplication"
   >
    <Window.Resources>
        <local:Employee x:Key="Employee" />
    </Window.Resources>
    <Grid DataContext="{StaticResource Employee}">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="200" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="ID:"/>
        <Label Grid.Row="1" Grid.Column="0" Content="Name:"/>
        <TextBox Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding EmployeeDetails.EmpID}" />
        <TextBox Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding EmployeeDetails.EmpName}" />
    </Grid>
</Window>

现在,在创建了包含员工详细信息的属性后,您应该使用该属性进行绑定:

Text="{Binding EmployeeDetails.EmpID}"
浦毅
2023-03-14

这段代码总是会失败。

如前所述,它表示:“在我的DataContext属性上查找名为“Employee”的属性,并将其设置为DataContext”属性。显然,这是不对的。

要让您的代码正常工作,请将您的窗口声明更改为:

<Window x:Class="SampleApplication.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SampleApplication"
    Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
   <local:Employee/>
</Window.DataContext>

这将声明一个新的XAML命名空间(本地)并将DataContext设置为员工类的实例。这将导致您的绑定显示默认数据(来自您的构造函数)。

但是,这不太可能是您真正想要的。相反,您应该有一个新类(称为主视图模型),其中包含一个员工属性,然后您绑定到该属性,如下所示:

public class MainViewModel
{
   public Employee MyEmployee { get; set; } //In reality this should utilize INotifyPropertyChanged!
}

现在你的XAML变成了:

<Window x:Class="SampleApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:SampleApplication"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
       <local:MainViewModel/>
    </Window.DataContext>
    ...
    <TextBox Grid.Column="1" Grid.Row="0" Margin="3" Text="{Binding MyEmployee.EmpID}" />
    <TextBox Grid.Column="1" Grid.Row="1" Margin="3" Text="{Binding MyEmployee.EmpName}" />

现在,您可以添加其他属性(其他类型、名称)等。有关更多信息,请参见实现模型-视图-视图模型模式

 类似资料:
  • 本文向大家介绍在WPF中动态加载XAML中的控件实例代码,包括了在WPF中动态加载XAML中的控件实例代码的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了在WPF中动态加载XAML中的控件的方法。分享给大家供大家参考,具体如下: xaml文件中的清单 更多关于C#相关内容感兴趣的读者可查看本站专题:《C#程序设计之线程使用技巧总结》、《C#操作Excel技巧总结》、《C#中XML文件操作技

  • 本文向大家介绍xaml 安装或设置,包括了xaml 安装或设置的使用技巧和注意事项,需要的朋友参考一下 示例 编写第一个XAML的最简单方法是安装Microsoft Visual Studio。它可以从Microsoft免费获得。 安装后,您可以使用VB.NET或C#代码创建WPF应用程序类型的新项目。 从某种意义上说,这与Windows窗体相似,因为您拥有一系列窗口,主要区别在于这些窗口是用XA

  • 以下是模型:https://github.com/xiaofaye/woocommerce.net/blob/master/woocommerce/v3/product.cs#L503 当生成列表时,我将迭代产品类。但是,图像存储在不同的模型中,我不知道如何在listview已经设置好之后调用Xaml的另一个类。 我只需要一个图像来传递我知道产品模型有一个列表称为图像,但我不知道如何将列表传递到图

  • 我是库伯内特人。我在Minikube中配置的整个设置。我不确定它是否与其他kubernetes设置有所不同。 我已经在我的设置中创建了一个POD,一个Spring Boot应用程序正在8080端口上运行,这个服务将在20080端口上向集群公开。 我正在运行tcpDum的集群内运行另一个pod。我需要在20080上转储撞击集群的HTTP数据包。请告诉我如何从tcpDumpod访问集群接口。 我尝试了

  • 问题内容: 我在wpf项目中有一个配置文件来存储连接字符串。但是,当我尝试获取AppSettings和ConnectionStrings时,将得到null。 WEB.config文件是这样的: 我尝试了几种方法: 他们都没有工作。 但是,这一工作: (这意味着我不能使用配置文件,这违反了我的意愿)我需要帮助。 问题答案: 我知道了!我不应该创建一个新的配置文件。项目中有一个默认的app.confi

  • 当您向网格面板添加一些行和列时,Visual Studio2019默认情况下会在XAML Designer视图中显示一些布局指示线,这在某些情况下会干扰我的视线。 有办法关闭它吗?