我已经编写了一个MVVM原型作为学习练习,我正在努力理解如何在视图之间进行通信。让我解释一下
我左边有一个树视图(leftSideView)
右侧的ListView(右侧视图)
MainWindow(包括上面提到的2个视图和分割器)
我实施的内容不起作用,如果你能指出我哪里出错或者有更好的方法,我想要你。 你可以从这里下载快速原型
http://cid-9db5ae91a2948485.skydrive.live.com/self.aspx/.Public/WpfCommunicationBetweenViews.zip
我肯定在使用bindind做错了。 了解你是如何做到这一点也很好。例如 ListBox在左边(一个视图)ListView在右边(另一个视图)你如何在两者之间进行通信。
非常感谢任何建议
答案 0 :(得分:2)
我看了你的代码,做了下面显示的修改,并且它有效。我将右侧视图更改为只有一个文本块来简化它。
MainWindow.xaml.cs(为两个要绑定的视图创建视图模型)
public partial class MainWindow
{
public MainWindow()
{
InitializeComponent();
}
public static ProtoViewModel MainViewModel = new ProtoViewModel(Repository.GetContinents());
}
LeftSideView.xaml.cs(将此视图的数据上下文设置为视图模型,并在更改时更新视图模型的选定城市)
public partial class LeftSideView
{
public LeftSideView()
{
InitializeComponent();
this.DataContext = MainWindow.MainViewModel;
}
/// <summary>
/// Update the selected city of the view model
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void OnTreeSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
(this.DataContext as ProtoViewModel).SelectedCity = e.NewValue as CityViewModel;
}
}
RightSideView.xaml.cs(设置右侧视图以使用相同的视图模型)
public partial class RightSideView
{
public RightSideView()
{
InitializeComponent();
this.DataContext = MainWindow.MainViewModel;
}
}
在RightSideView.xaml中,我只是放下如下所示的文本框:
<TextBlock Text="{Binding SelectedCity.Details.City.Name}"/>
当选择左侧视图中的城市时,它将在视图模型上更改所选城市,因此,它将在右视图上更新所选城市名称。
这是ProtoViewModel类的样子:
public class ProtoViewModel : Core.ViewModelBase
{
public ProtoViewModel(IEnumerable<ContinentInfo> continents)
{
Continents =
new ReadOnlyCollection<ContinentViewModel>(
(from continent in continents
select new ContinentViewModel(continent)).ToList());
}
public ViewModels.CityViewModel SelectedCity
{
get { return selectedCity; }
set
{
if(selectedCity != value)
{
selectedCity = value;
OnPropertyChanged("SelectedCity");
}
}
}
private ViewModels.CityViewModel selectedCity;
public ReadOnlyCollection<ContinentViewModel> Continents
{
get { return continents; }
set
{
if (continents != value)
{
continents = value;
OnPropertyChanged("Continents");
}
}
}
private ReadOnlyCollection<ContinentViewModel> continents;
}
我会与你分享修改后的文件,但我不知道该怎么做:)
答案 1 :(得分:1)