3

我有一个 WPF 表单和一个类用户(内容属性 Id、登录名和名称),在我的这个表单类中,我有一个用户对象,用于将此信息放入表单DataContextBinding

我可以把这个用户对象放在我Window.DataContext (this.DataContext = usersObject;)后面的代码中,但我认为如果我可以用 XAML 来做这个,也许会更好

我在我的类 UserForm ( public Users usersObject {get; set;})中设置了一个属性

我的表格UserForm : Window

<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>

用户窗体.xaml.cs

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; }
}

我如何为 TextBoxuserObject本身设置设置Window.DataContext值?

4

5 回答 5

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 中执行此操作,您将执行类似这样的操作

视图模型.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。

查看.xaml.cs

公共类用户窗体:窗口{

    public UserForm(Users user)
    {
        InitializeComponent();
        this.DataContext = new UserViewModel(user);
    }

查看.xaml

您有两个选择,您可以像我在代码后面所做的那样显式设置 DataContext,或者您可以创建一个返回 UserViewModel 的公共属性。这是一样的

模型.cs

public class Users { //Whatever properties you need }

现在这是一个非常简单的 MVVM 模式示例。一旦您了解了基础知识,您就可以集成一些为您实现 MVVM 的有用框架,例如Caliburn MicroMVVM Toolkit

于 2013-09-24T03:38:00.290 回答
5

前段时间,我写了一篇文章,介绍了将 XAML 控件绑定到属性后代码的不同选项。这可能会帮助你。

http://codingseason.blogspot.in/2013/05/data-binding-xaml-control-to-property.html

于 2013-09-24T05:03:00.393 回答
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,它会更有意义

于 2013-09-24T04:02:08.713 回答
1

这是直接从 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>
于 2015-02-23T09:17:59.703 回答
0

也许您可以定义一个 DependencyProperty 来包装对 userObject 的访问,然后将其绑定到 DataContext

于 2013-09-24T03:17:15.257 回答