Как обновить текст в представлении по нажатию кнопки из другого представления в WPF Prism? - PullRequest
0 голосов
/ 28 октября 2018

Я новичок в Prism и пытаюсь обновить текст в MainWindow.xaml, другой вид в регионе.

MainWindowViewModel

private string _message = "Prism";
public string Message
{
    get { return _message; }
    set { SetProperty(ref _message, value);}
}

MainWindow.xaml

<Window x:Class="XXXX.Views.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:prism="http://prismlibrary.com/"
    prism:ViewModelLocator.AutoWireViewModel="True"
    Title="{Binding Title}">
<Grid>
    <StackPanel>
        <TextBlock Text="{Binding Message, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" FontSize="48"></TextBlock>
        <ContentControl prism:RegionManager.RegionName="ViewARegion" />
    </StackPanel>
</Grid>

ViewAViewModel

public ICommand ClickCommand
{
    get;
    private set;
}
public ViewAViewModel()
{
    ClickCommand = new DelegateCommand(ClickedMethod);
}

private void ClickedMethod()
{
    MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();
    mainWindowViewModel.Message = "Prism View A";
}

ViewA.xaml

<UserControl x:Class="XXXX.Views.ViewA"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:XXXX.Views"
         xmlns:prism="http://prismlibrary.com/"
         prism:ViewModelLocator.AutoWireViewModel="True"
         mc:Ignorable="d">
<Grid>
    <StackPanel>
        <Button Content="Click"
             Command="{Binding ClickCommand}">
        </Button>
    </StackPanel>
</Grid>

Теперь, когда я нажимаю кнопку, она работает правильно, я имею в видуон устанавливает свойство Message в MainWindowViewModel, но не обновляет представление в MainWindow.xaml.Что я должен сделать, чтобы заставить это работать, поскольку я ожидаю обновить представление при нажатии кнопки?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Вы можете использовать агрегатор событий для отправки события от ViewAViewModel до MainWindowViewModel:

public class ViewAViewModel
{
    private readonly IEventAggregator _eventAggregator;

    public ViewAViewModel(IEventAggregator eventAggregator)
    {
        _eventAggregator = eventAggregator;
        ClickCommand = new DelegateCommand(ClickedMethod);
    }

    public ICommand ClickCommand
    {
        get;
        private set;
    }

    private void ClickedMethod()
    {
        _eventAggregator.GetEvent<PubSubEvent<string>>().Publish("Prism View A");
    }
}

public class MainWindowViewModel : BindableBase
{
    public MainWindowViewModel(IEventAggregator eventAggregator)
    {
        eventAggregator.GetEvent<MessageSentEvent>().Subscribe(MessageReceived);
    }

    private void MessageReceived(string message)
    {
        Message = message;
    }

    private string _message = "Prism";
    public string Message
    {
        get { return _message; }
        set { SetProperty(ref _message, value); }
    }
}

На GitHub доступен полный пример: https://github.com/PrismLibrary/Prism-Samples-Wpf/tree/master/14-UsingEventAggregator

0 голосов
/ 28 октября 2018
MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();
mainWindowViewModel.Message = "Prism View A";

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

Вам необходимо реализовать некоторую модель представления для просмотра механизма взаимодействия модели, например, использовать IEventAggregator или общую службу, поэтомучто информация («произошел щелчок» или «сообщение изменено» или что-либо еще) может быть передана из ViewA в MainWindow.

...