我有以下代码:
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
属性绑定到MainWindow.xaml中Textbox的Text属性,但我的这些文本框中没有出现任何内容当我运行代码时。绑定是对的吗?
答案 0 :(得分:92)
此代码将始终失败。
正如所写,它说:&#34;寻找名为&#34;员工&#34;在我的DataContext属性上,并将其设置为DataContext属性&#34;。显然,这是不对的。
要使代码正常工作,请将窗口声明更改为:
<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类的实例。这将导致绑定显示默认数据(来自构造函数)。
然而,这实际上并不是你想要的。相反,你应该有一个新的类(称之为MainViewModel),然后绑定一个Employee
属性,如下所示:
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
答案 1 :(得分:16)
首先,您应该在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}"
答案 2 :(得分:2)
这里有几个问题。
DataContext="{Binding Employee}"
,因为它是一个复杂的对象,不能分配为字符串。因此,您必须使用<Window.DataContext></Window.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;
}
}