Кажется, не может общаться между взглядами - PullRequest
0 голосов
/ 17 мая 2010

Я написал прототип MVVM в качестве учебного упражнения и изо всех сил пытаюсь понять, как я могу общаться между представлениями. Позвольте мне объяснить

У меня есть дерево слева (leftSideView)

ListView справа (rightSideView)

MainWindow (включает в себя 2 вида, упомянутых выше, и разделитель)

То, что я реализовал, не работает, и я хотел бы, чтобы вы указали, где я ошибаюсь, или если есть лучший способ сделать это. Вы можете скачать быстрый прототип здесь

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

Конечно, я делаю что-то не так с bindind. Также было бы неплохо узнать, как ты это делаешь. НАПРИМЕР ListBox слева (один вид) ListView Справа (другой вид) как вы общаетесь между ними.

Большое спасибо за любые предложения

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

Я посмотрел ваш код, внес изменения, показанные ниже, и это сработало. Я изменил вид справа, чтобы просто иметь текстовый блок, чтобы немного упростить его.

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 голос
/ 07 июня 2010

Вы можете также рассмотреть возможность использования слабосвязанного паттерна медиатора. См. Например:

Посредник Лорана Бюньона в наборе инструментов MVVM Light здесь

Вестник Фонда MVVM здесь

Агрегатор событий Призмы здесь

Аггрегатор ISuckLessEvent Джоша Твиста здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...