我有一个WPF表单和一个类Users(内容属性Id,Login和Name),在我的这个表单的类中,我得到了一个Users对象,用于将此信息放在带有DataContext
和{的表单中{1}}
我可以将这个Users对象放到我的Binding
后面,但是我想如果我可以用XAML做这个,也许更好
我在我的类UserForm(Window.DataContext (this.DataContext = usersObject;)
)
我的表单public Users usersObject {get; set;}
UserForm : Window
UserForm.xaml.cs
<Window DataContext="{What need I put here?">
<Grid>
<TextBlock Text="Id:"/>
<TextBox Name="Id" Text="{Binding Path=Id}"/>
<TextBlock Text="Login:"/>
<TextBox Name="Login" Text="{Binding Path=Login}"/>
<TextBlock Text="Name:"/>
<TextBox Name="Name" Text="{Binding Path=Name}"/>
</Grid>
</Window>
我的班级用户
public class UserForm : Window
{
public Users userObject { get; set; }
public UserForm(Users user)
{
InitializeComponent();
this.userObject = user;
}
}
我如何为自己设置public class Users
{
public int Id { get; set; }
public string Login { get; set; }
public string Name { get; set; }
}
userObject
,对于TextBox来说,可以为它设置值?
答案 0 :(得分:5)
删除DataContext绑定,因为您没有显式执行MVVM模式。没有必要做绑定。
在您的Window.xaml
中<Window>
<Grid>
<TextBlock Text="Id:"/>
<TextBox Name="Id" Text="{Binding Path=Id}"/>
<TextBlock Text="Login:"/>
<TextBox Name="Login" Text="{Binding Path=Login}"/>
<TextBlock Text="Name:"/>
<TextBox Name="Name" Text="{Binding Path=Name}"/>
</Grid>
将其添加到代码 Window.xaml.cs
后面 public class UserForm : Window
{
public Users userObject { get; set; }
public UserForm(Users user)
{
InitializeComponent();
this.DataContext = user;
}
}
如果你在MVVM中这样做,你会做这样的事情
<强> ViewModel.cs 强>
public class UserViewModel
{
private Users _model;
public UserViewModel(Users model)
{
_model = model;
}
public int Id { get { return _model.Id; } }
public string Login { get { return _model.Login; } set { _model.Login; } }
public string Name { get { return _model.Name; } set { _model.Name; } }
}
现在可以根据需要自定义ViewModel,可以公开Model,将其注入构造函数,或者只是在暴露时设置属性值。如果要将ViewModel中的任何值传播回用户界面,请不要忘记实现INotifyPropertyChanged。
<强> View.xaml.cs 强>
公共类UserForm:Window {
public UserForm(Users user)
{
InitializeComponent();
this.DataContext = new UserViewModel(user);
}
<强> View.xaml 强>
您有两个选择,您可以像我在代码后面那样显式设置DataContext,也可以创建一个返回UserViewModel的公共属性。它只是一样的
<强> Model.cs 强>
public class Users { //Whatever properties you need }
现在这是一个非常简单的MVVM模式示例。一旦了解了基础知识,就可以为Caliburn Micro和MVVM Toolkit
整合一些实现MVVM的有用框架。答案 1 :(得分:5)
一段时间后,我写了一篇关于将XAML控件绑定到代码隐藏属性的不同选项的文章。这可能会对你有所帮助。
http://codingseason.blogspot.in/2013/05/data-binding-xaml-control-to-property.html
答案 2 :(得分:2)
创建UserForm的对象并分配数据上下文非常简单。
UserForm userFormView = new UserForm ();
Users dataContextObject = new Users();
userFormView.DataContext = dataContextObject;
userFormView.Show() //you can also use showdialog. Thats up to you
最好删除以下代码:
public Users userObject { get; set; }
public UserForm(Users user)
{
InitializeComponent();
this.userObject = user;
}
最好将视图和视图模型分开。看看MVVM,它会更有意义
答案 3 :(得分:0)
也许你可以定义一个DependencyProperty来包装对userObject的访问, 然后将其绑定到DataContext
答案 4 :(得分:0)
这是直接从xaml分配DataContext的方法之一。
示例App.xaml
<Application.Resources>
<local:Users x:Key="Users"/>
</Application.Resources>
示例UserForm.xaml
<Window DataContext="{StaticResource Users}">
<Grid>
<TextBlock Text="Id:"/>
<TextBox Name="Id" Text="{Binding Path=Id}"/>
<TextBlock Text="Login:"/>
<TextBox Name="Login" Text="{Binding Path=Login}"/>
<TextBlock Text="Name:"/>
<TextBox Name="Name" Text="{Binding Path=Name}"/>
</Grid>
</Window>