Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 23.07.2015, 00:21   #1
CWD
Форумчанин
 
Регистрация: 10.11.2009
Сообщений: 50
Репутация: 10
По умолчанию WPF Mvvm

Добрый день, возникла следующая проблема. Насколько я понимаю в модели MVVM предполагается наличие 3 основных компонент View с XAML разметкой и стилями, ViewModel, которая делегирует методы Model и взаимодействует с View и сама Model которая описывает логику. Возникла необходимость совместить в одной View несколько UserControl's. Но каким образом передавать данные например из одного ViewModel другим вложенным ViewModel's UserControlo-в. В данном пример использован MVVMLight messenger. Сама идея состоит в следующем основная станица MainWindow содержит переключаемое содержимое, может переключать на SomeInfoBicyclesView,SomeInfoCarsVi ew, каждая из этих View содержит некий общий View такой как BuyPanel, сам BuyPanel содержит некоторое поле label которое должно получить на вход некий елемент который был отправлен Messenger например из "SomeInfoBicycles ". Но вся проблема в том насколько я понимаю что скорость инициализации класов разная и обьект который регистрируется для получения сообщений инициализируется позже самой отправки сообщения. Это можно исправить асинхронным костылем:

Код:

 "  SendData();
        //Action TimeDelay = new Action(Hold);
        //IAsyncResult result =TimeDelay.BeginInvoke(null,null);"

Главный вопрос, что делать и как этого избежать в данном случае? Использовать другие подходы?Могу выложить на репозитории исходный код.

Содержит контент контрол который переключает на нужную View.
MainWindow.xaml:

Код:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Button Content="DisplayCars" HorizontalAlignment="Left" Margin="20,10,0,0" VerticalAlignment="Top" Width="75" Command="{Binding DisplayCars}"/>
    <Button Content="DisplayBicycles" HorizontalAlignment="Left" Margin="20,35,0,0" VerticalAlignment="Top" Width="75" Command="{Binding DisplayBicycles}"/>
    <ContentControl Grid.Column="1" Content="{Binding CurrentViewModel}" HorizontalAlignment="Stretch"  VerticalAlignment="Stretch"/>
</Grid>

Реализация переключения
MainWindows.cs

Код:

namespace WpfApplication95.ViewModel
{
public class MainViewModel : ViewModelBase
{
    readonly static Cars cars = new Cars();
    readonly static Bicycles bicycles = new Bicycles();
    private ViewModelBase currentViewModel ;
    public ViewModelBase CurrentViewModel
    {
        get
        {
            return currentViewModel;
        }
        set
        {
            if (currentViewModel == value)
                return;
            currentViewModel = value;
            RaisePropertyChanged("CurrentViewModel");
        }
    }
            public ICommand DisplayCars { get;set; }
            public ICommand DisplayBicycles { get; set; }
    public MainViewModel()
    {
        CurrentViewModel = MainViewModel.cars;
        DisplayCars = new RelayCommand(() => SetCars());
        DisplayBicycles = new RelayCommand(()=>SetBicycles());
    }
    public void SetCars()
    {
        CurrentViewModel = MainViewModel.cars;
    }
    public void SetBicycles()
    {
        CurrentViewModel = MainViewModel.bicycles;
    }
}
}

SomeInfoBicycles.xaml:

Код:

<Grid>
    <StackPanel>
        <ListView ItemsSource="{Binding ItemsBicycles}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <Label Content="{Binding .}"></Label>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
        <views:BuyPanelView></views:BuyPanelView>
    </StackPanel>
</Grid>

SomeInfoBicycle.cs:
Код:

 public class SomeInfoBicycles : ViewModelBase
{

    public ObservableCollection<string> ItemsBicycles { get; set; }
    public SomeInfoBicycles()
    {
        ItemsBicycles = new ObservableCollection<string>();
        ItemsBicycles.Add("First Bicycle");
        ItemsBicycles.Add("Second Bicycle");
        ItemsBicycles.Add("Third Bicycle");
        SendData();
        //Action TimeDelay = new Action(Hold);
        //IAsyncResult result =TimeDelay.BeginInvoke(null,null);
    }
    public void Hold()
    {
        System.Threading.Thread.Sleep(3000);
        SendData();
    }
    public void SendData()
    {
        Messenger.Default.Send<MessageCommunicator>(new MessageCommunicator { Data = ItemsBicycles[1] });
    }
}

Код:

BuyPanel.cs:

 public class BuyPanel : ViewModelBase
{

    private string inputData;
    public string InputData 
    {
        get { return inputData; }
        set { inputData = value; RaisePropertyChanged("InputData"); }
    }
    public BuyPanel()
    {
        Messenger.Default.Register<MessageCommunicator>(this, (emp) => { InputData = emp.Data; });
        Debug.WriteLine(InputData);
    }
}

Код:

BuyPanel.View:

    <StackPanel>
    <Label Content="{Binding InputData}"></Label>
    <Button>Buy</Button>
</StackPanel>


Последний раз редактировалось CWD; 23.07.2015 в 00:24.
CWD вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C# WPF MVVM Editable Combobox in DataGrid Famine WPF, UWP, WinRT, XAML 1 22.09.2014 17:11
Вложенный биндинг MVVM WPF Egoist42 WPF, UWP, WinRT, XAML 0 29.08.2014 07:37
Комманды и ICommand в WPF MVVM andy301086 WPF, UWP, WinRT, XAML 0 09.07.2012 01:04
WPF контекстное меню для ListBox MVVM Нике WPF, UWP, WinRT, XAML 0 29.04.2012 15:26
WPF LisBox Selectionchanged to MVVM Нике WPF, UWP, WinRT, XAML 0 10.04.2012 22:31


19:01.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru