我有以下代码:
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 类中的 EmpID
和 EmpName
属性绑定(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/