Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.07.2015, 23:21   #1
CWD
Пользователь
 
Регистрация: 10.11.2009
Сообщений: 50
По умолчанию 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; 22.07.2015 в 23:24.
CWD вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
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