c# - 在 WPF 的 XAML 中设置 DataContext

标签 c# wpf xaml

我有以下代码:

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 属性绑定(bind)到 MainWindow.xaml 中文本框的文本属性,但什么也没有当我运行代码时出现在我的这些文本框中。绑定(bind)对不对?

最佳答案

这段代码总是会失败。

如所写,它说:“在我的 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 设置为 Employee 类的一个实例。这将导致您的绑定(bind)显示默认数据(来自您的构造函数)。

但是,这实际上不太可能是您想要的。相反,您应该有一个新类(称为 MainViewModel),其中包含一个 Employee 属性,然后您将绑定(bind)到该属性,如下所示:

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

现在您可以添加其他属性(其他类型、名称)等。有关详细信息,请参阅 Implementing the Model-View-ViewModel Pattern

关于c# - 在 WPF 的 XAML 中设置 DataContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23713898/

相关文章:

wpf - 绑定(bind)到 ColumnDefinition.ActualWidth 返回 0

c# - WPF 绑定(bind)到资源中的元素

c# - Entity Framework 中 Select 和 Where 之间的区别

c# - 为什么 Point.Offset() 没有在只读结构中给出编译器错误?

c# - 将音频源(并发)动态发送到 ASIO 设备上的特定 channel

c# - 我无法让 ProcessCmdKey 工作?

c# - 使用键盘作为XAML和C#计算器的输入

c# - 如何让 WPF ContextMenu 在打开时自动选择第一个项目?

wpf - 如何在silverlight中在网格周围设置阴影?

c# - 将动态创建的菜单项从 Button.ContextMenu 绑定(bind)到 ICommand