似乎无法在视图之间进行通信

时间:2010-05-17 12:29:34

标签: mvvm

我已经编写了一个MVVM原型作为学习练习,我正在努力理解如何在视图之间进行通信。让我解释一下

我左边有一个树视图(leftSideView)

右侧的ListView(右侧视图)

MainWindow(包括上面提到的2个视图和分割器)

我实施的内容不起作用,如果你能指出我哪里出错或者有更好的方法,我想要你。 你可以从这里下载快速原型

http://cid-9db5ae91a2948485.skydrive.live.com/self.aspx/.Public/WpfCommunicationBetweenViews.zip

我肯定在使用bindind做错了。 了解你是如何做到这一点也很好。例如 ListBox在左边(一个视图)ListView在右边(另一个视图)你如何在两者之间进行通信。

非常感谢任何建议

2 个答案:

答案 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)

您也可以考虑使用松散耦合的Mediator模式。例如见:

Laurent Bugnion在MVVM Light Toolkit中的中介here

MVVM Foundation的Messenger here

Prism的事件聚合器here

Josh Twist的ISuckLessEventAggregator here