如何在从其他usercontrol更改字段值时将字段绑定到文本框

时间:2016-05-08 08:23:41

标签: c# wpf mvvm

WPF相对较新。

希望正确地做事,即ViewModel设计。

我有2个用户控件。

第一个有一个下拉框,其中有一个作业参考列表。

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

所以,在我的第二个用户控件中,我有这个标记:

(只是有问题的控件)

<TextBox Name="txtFirstName" Text="{Binding Test}" />
代码隐藏中的

public ucJobServiceRequirements()
{
    InitializeComponent();
    this.DataContext = new ViewModel.JobRecord();
}

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

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:

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:

public class ViewModelBase : INotifyPropertyChanged
{
    internal void RaisePropertyChanged(string prop)
    {
        if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); }
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

和我的模特:

public class Job
{
    public string FirstName{ get; set; }
}

现在,当用户选择Job Ref:

vm.JobView = InformedWorkerBusinessService.Job.Get(job.JobRef);

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

set { _Test = value; RaisePropertyChanged("Test"); }

所以,我的Biding在UI中看起来是错的(我想!)但是看不出有什么问题。

就像我说我对这一切都是新手。

由于

1 个答案:

答案 0 :(得分:1)

this.DataContext = new ViewModel.JobRecord();

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

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

<Window ... xmlns:viewModel="clr-namespace:ViewModel">
    <Window.DataContext>
        <viewModel:JobRecord />
    </Window.DataContext>
    ...
    <local:ucJobServiceRequirements ... />
    <local:ucCustomerJobDetails ... />
    ...
</Window>

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