首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当字段值从不同的用户控件更改时,如何将字段绑定到文本框

当字段值从不同的用户控件更改时,如何将字段绑定到文本框
EN

Stack Overflow用户
提问于 2016-05-08 08:23:40
回答 1查看 32关注 0票数 0

相对较新的WPF。

希望做正确的事情,也就是ViewModel设计。

我有两个用户控件。

第一个有一个下拉框,其中有一个职务引用列表。

当用户选择一个时,我希望显示链接的字段。

因此,在我的第二个用户控件中,我有这样的标记:

(只是有关的控制)

代码语言:javascript
复制
<TextBox Name="txtFirstName" Text="{Binding Test}" />

在代码隐藏中:

代码语言:javascript
复制
public ucJobServiceRequirements()
{
    InitializeComponent();
    this.DataContext = new ViewModel.JobRecord();
}

当用户选择作业引用时,我的第一个用户控件中的代码是:

代码语言:javascript
复制
public ucCustomerJobDetails()
{
    InitializeComponent();
    this.DataContext = new ViewModel.JobRecord();
}

private void cboCustomerJobs_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    JobHistory job = cboCustomerJobs.SelectedItem as JobHistory;
    var vm = this.DataContext as ViewModel.JobRecord;
    vm.JobView = InformedWorkerBusinessService.Job.Get(job.JobRef);
}

我的ViewModel:

代码语言:javascript
复制
public class JobRecord : ViewModelBase
{
    public JobRecord()
    {           
    }

    Job _Job;
    public Job JobView
    {
        get { return _Job; }
        set { _Job = value; RaisePropertyChanged("JobView"); Test = JobView.FirstName; }
    }

    string _Test;
    public string Test
    {
        get { return _Test; }
        set { _Test = value; RaisePropertyChanged("Test"); }
    }
}

我的ViewModelBase:

代码语言:javascript
复制
public class ViewModelBase : INotifyPropertyChanged
{
    internal void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

我的模特:

代码语言:javascript
复制
public class Job
{
    public string FirstName{ get; set; }
}

现在,当用户选择Job时:

代码语言:javascript
复制
vm.JobView = InformedWorkerBusinessService.Job.Get(job.JobRef);

这是被调用的(我通过调试器检查):

代码语言:javascript
复制
set { _Test = value; RaisePropertyChanged("Test"); }

所以,我的招投标似乎在UI中是错误的(我想!)但却看不出是怎么回事。

就像我说的,我对这一切都很陌生。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-08 09:04:30

线

代码语言:javascript
复制
this.DataContext = new ViewModel.JobRecord();

在两个UserControls的构造函数中,每个构造函数都创建一个JobRecord视图模型类的实例。现在您有了两个视图模型实例,它们之间没有任何交互。

与其在UserControl的XAML或后面的代码中创建视图模型实例,不如在公共父控件中创建一个视图模型实例(例如,应用程序的主窗口),让UserControls继承父控件的DataContext

代码语言:javascript
复制
<Window ... xmlns:viewModel="clr-namespace:ViewModel">
    <Window.DataContext>
        <viewModel:JobRecord />
    </Window.DataContext>
    ...
    <local:ucJobServiceRequirements ... />
    <local:ucCustomerJobDetails ... />
    ...
</Window>

作为一般规则,您永远不应该显式地设置一个DataContext的UserControl,因为这会阻止继承父控件的DataContext。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37097752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档