相对较新的WPF。
希望做正确的事情,也就是ViewModel设计。
我有两个用户控件。
第一个有一个下拉框,其中有一个职务引用列表。
当用户选择一个时,我希望显示链接的字段。
因此,在我的第二个用户控件中,我有这样的标记:
(只是有关的控制)
<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时:
vm.JobView = InformedWorkerBusinessService.Job.Get(job.JobRef);这是被调用的(我通过调试器检查):
set { _Test = value; RaisePropertyChanged("Test"); }所以,我的招投标似乎在UI中是错误的(我想!)但却看不出是怎么回事。
就像我说的,我对这一切都很陌生。
谢谢
发布于 2016-05-08 09:04:30
线
this.DataContext = new ViewModel.JobRecord();在两个UserControls的构造函数中,每个构造函数都创建一个JobRecord视图模型类的实例。现在您有了两个视图模型实例,它们之间没有任何交互。
与其在UserControl的XAML或后面的代码中创建视图模型实例,不如在公共父控件中创建一个视图模型实例(例如,应用程序的主窗口),让UserControls继承父控件的DataContext
<Window ... xmlns:viewModel="clr-namespace:ViewModel">
<Window.DataContext>
<viewModel:JobRecord />
</Window.DataContext>
...
<local:ucJobServiceRequirements ... />
<local:ucCustomerJobDetails ... />
...
</Window>作为一般规则,您永远不应该显式地设置一个DataContext的UserControl,因为这会阻止继承父控件的DataContext。
https://stackoverflow.com/questions/37097752
复制相似问题