我刚开始使用MVVM,我一直在阅读它并做一些例子。我设法创建了一个应用程序,它将从数据库中读取,然后填充到列表框中。我很难尝试将所选项目链接到另一个视图,然后在该视图viewModel中进行一些处理。请有人向我解释从view1列表框中获取当前所选项目然后在view2标签上输出所选项目的正确方法吗?
这是我的XAML:
<local:SecondView Margin="499,30,0,20">
<local:SecondView.DataContext>
<v:MainViewModel />
</local:SecondView.DataContext>
</local:SecondView>
<Button Height="22" HorizontalAlignment="Left" Margin="8,4,0,0" Name="button1" VerticalAlignment="Top" Width="48" Command="{Binding Path=GetDataCommand}">Button</Button>
<ListBox ItemsSource="{Binding Path=FileData}" SelectedItem="{Binding dr}" Height="330" HorizontalAlignment="Left" Margin="149,30,0,0" Name="listBox1" VerticalAlignment="Top" Width="250" DisplayMemberPath="DDFName" />
这段代码在我的viewModel1:
中private DataRowView _dr;
public DataRowView dr
{
get{
return _dr;
}
set
{
_dr = value;
OnPropertyChanged("dr");}
}
我想以某种方式获取viewModel2以获取dr的新值(这是在view1列表框中选择的项目),然后在view2上我想显示一些细节
提前致谢!
答案 0 :(得分:3)
您的ViewModel2类取决于Row - &gt;在ViewModel2中注入依赖项的一种可能性是通过构造函数传递它。
public class ViewModel1
{
private DataRowView _dr;
public DataRowView dr
{
get
{
return _dr;
}
set
{
_dr = value;
OnPropertyChanged("dr");
this.DetailView = new ViewModel2(value); //On Change of the selected Row create a new viewModel which serves as detail view
}
}
private ViewModel2 _DetailView;
public ViewModel2 DetailView
{
get
{
return _DetailView;
}
set
{
if (_DetailView != value)
{
_DetailView = value;
RaisePropertyChanged(() => this.DetailView);
}
}
}
}
public class ViewModel2
{
public ViewModel2(DataRowView row)
{
this.Row = row;
}
private DataRowView _Row;
public DataRowView Row
{
get
{
return _Row;
}
set
{
if (_Row != value)
{
_Row = value;
RaisePropertyChanged(() => this.Row);
}
}
}
}
在您的XAML中,您可以将datacontext直接设置为详细信息视图:
<local:SecondView Margin="499,30,0,20" DataContext="{Binding DetailView, Mode=OneWay}" />
答案 1 :(得分:1)
你可以使用其他解决方案http://sharedprop.codeplex.com,阅读源代码是一种在对象之间共享属性的方法,如果第二个对象不活动也可以工作...只检查信息