如何使用XAML在DataContext中设置类?

时间:2013-09-24 02:39:14

标签: c# wpf binding datacontext

我有一个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来说,可以为它设置值?

5 个答案:

答案 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 MicroMVVM 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>