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中看起来是错的(我想!)但是看不出有什么问题。
就像我说我对这一切都是新手。
由于
答案 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。